码迷,mamicode.com
首页 > 移动开发 > 详细

iOS开发经验总结(下)

时间:2016-05-10 18:07:51      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:

四十、AFNetworking 传送 form-data

 

将JSON的数据,转化为NSData, 放入Request的body中。 发送到服务器就是form-data格式。

 

四十一、非空判断注意

 

BOOL hasBccCode = YES;

if ( nil == bccCodeStr

    || [bccCodeStr isKindOfClass:[NSNull class]]

    || [bccCodeStr isEqualToString:@""])

{

    hasBccCode = NO;

}

 

如果进行非空判断和类型判断时,需要新进行类型判断,再进行非空判断,不然会crash。

 

四十二、iOS 8.4 UIAlertView 键盘显示问题

 

可以在调用UIAlertView 之前进行键盘是否已经隐藏的判断。

 

@property (nonatomic, assign) BOOL hasShowdKeyboard;

 

[[NSNotificationCenter defaultCenter] addObserver:self

                                         selector:@selector(showKeyboard)

                                             name:UIKeyboardWillShowNotification

                                           object:nil];

 

[[NSNotificationCenter defaultCenter] addObserver:self

                                         selector:@selector(dismissKeyboard)

                                             name:UIKeyboardDidHideNotification

                                           object:nil];

 

(void)showKeyboard

{

    self.hasShowdKeyboard = YES;

}

 

(void)dismissKeyboard

{

    self.hasShowdKeyboard = NO;

}

 

while ( self.hasShowdKeyboard )

{

    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];

}

 

UIAlertView* alerview = [[UIAlertView alloc] initWithTitle:@"" message:@"取消修改?" delegate:self cancelButtonTitle:@"取消" otherButtonTitles@"确定", nil];

[alerview show];

 

四十三、模拟器中文输入法设置

 

模拟器默认的配置种没有“小地球”,只能输入英文。加入中文方法如下:

 

选择Settings—>General–>Keyboard–>International KeyBoards–>Add New Keyboard–>Chinese Simplified(PinYin) 即我们一般用的简体中文拼音输入法,配置好后,再输入文字时,点击弹出键盘上的“小地球”就可以输入中文了。

如果不行,可以长按“小地球”选择中文。

 

四十四、iPhone number pad

 

phone 的键盘类型:

 

  1. number pad 只能输入数字,不能切换到其他输入

     

    技术分享

     

  2. phone pad 类型: 拨打电话的时候使用,可以输入数字和 + * #

    技术分享

 

四十五、UIView 自带动画翻转界面

 

(IBAction)changeImages:(id)sender

{

    CGContextRef context = UIGraphicsGetCurrentContext();

 

    [UIView beginAnimations:nil context:context];

    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

    [UIView setAnimationDuration:1.0];

 

    [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:_parentView cache:YES];

    [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:_parentView cache:YES];

    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:_parentView cache:YES];

    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:_parentView cache:YES];

 

    NSInteger purple = [[_parentView subviews] indexOfObject:self.image1];

    NSInteger maroon = [[_parentView subviews] indexOfObject:self.image2];

 

    [_parentView exchangeSubviewAtIndex:purple withSubviewAtIndex:maroon];

 

    [UIView setAnimationDelegate:self];

    [UIView commitAnimations];

}

 

四十六、KVO 监听其他类的变量

 

[[HXSLocationManager sharedManager] addObserver:self

                                         forKeyPath:@"currentBoxEntry.boxCodeStr"

                                            options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionOld context:nil];

 

在实现的类self中,进行[HXSLocationManager sharedManager]类中的变量@“currentBoxEntry.boxCodeStr” 监听。

 

四十七、ios9 crash animateWithDuration

 

在iOS9 中,如果进行animateWithDuration 时,view被release 那么会引起crash。

 

[UIView animateWithDuration:0.25f animations:^{

        self.frame = selfFrame;

    } completion:^(BOOL finished) {

        if (finished) {

            [super removeFromSuperview];

        }

    }];

 

会crash。

 

[UIView animateWithDuration:0.25f

                          delay:0

         usingSpringWithDamping:1.0

          initialSpringVelocity:1.0 options:UIViewAnimationOptionCurveLinear

                     animations:^{

                         self.frame = selfFrame;

                     } completion:^(BOOL finished) {

                         [super removeFromSuperview];

                     }];

 

不会Crash。

 

四十八、对NSString进行URL编码转换

 

iPTV项目中在删除影片时,URL中需传送用户名与影片ID两个参数。当用户名中带中文字符时,删除失败。

 

之前测试时,手机号绑定的用户名是英文或数字。换了手机号测试时才发现这个问题。

 

对于URL中有中文字符的情况,需对URL进行编码转换。

 

urlStr = [urlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

 

 

四十九、Xcode iOS加载图片只能用PNG

 

虽然在Xcode可以看到jpg的图片,但是在加载的时候会失败。

错误为 Could not load the “ReversalImage1” image referenced from a nib in the bun

 

必须使用PNG的图片。

 

 


 

如果需要使用JPG 需要添加后缀

 

[UIImage imageNamed:@"myImage.jpg"];

 

五十、保存全屏为image

 

CGSize imageSize = [[UIScreen mainScreen] bounds].size;

UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0);

CGContextRef context = UIGraphicsGetCurrentContext();

 

for (UIWindow * window in [[UIApplication sharedApplication] windows]) {

    if (![window respondsToSelector:@selector(screen)] || [window screen] == [UIScreen mainScreen]) {

        CGContextSaveGState(context);

        CGContextTranslateCTM(context, [window center].x, [window center].y);

        CGContextConcatCTM(context, [window transform]);

        CGContextTranslateCTM(context, -[window bounds].size.width*[[window layer] anchorPoint].x, -[window bounds].size.height*[[window layer] anchorPoint].y);

        [[window layer] renderInContext:context];

 

        CGContextRestoreGState(context);

    }

}

 

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

 

五十一、判断定位状态 locationServicesEnabled

 

这个[CLLocationManager locationServicesEnabled]检测的是整个iOS系统的位置服务开关,无法检测当前应用是否被关闭。通过

 

CLAuthorizationStatus status = [CLLocationManager authorizationStatus];

    if (kCLAuthorizationStatusDenied == status || kCLAuthorizationStatusRestricted == status) {

        [self locationManager:self.locationManager didUpdateLocations:nil];

    } else { // the user has closed this function

        [self.locationManager startUpdatingLocation];

    }

 

CLAuthorizationStatus来判断是否可以访问GPS

 

五十二、微信分享的时候注意大小

 

text 的大小必须 大于0 小于 10k

 

image 必须 小于 64k

 

url 必须 大于 0k

 

五十三、图片缓存的清空

 

一般使用SDWebImage 进行图片的显示和缓存,一般缓存的内容比较多了就需要进行清空缓存

 

清除SDWebImage的内存和硬盘时,可以同时清除session 和 cookie的缓存。

 

// 清理内存

[[SDImageCache sharedImageCache] clearMemory];

 

// 清理webview 缓存

NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];

for (NSHTTPCookie *cookie in [storage cookies]) {

    [storage deleteCookie:cookie];

}

 

NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];

[config.URLCache removeAllCachedResponses];

[[NSURLCache sharedURLCache] removeAllCachedResponses];

 

// 清理硬盘

[[SDImageCache sharedImageCache] clearDiskOnCompletion:^{

    [MBProgressHUD hideAllHUDsForView:self.view animated:YES];

 

    [self.tableView reloadData];

}];

 

五十四、TableView Header View 跟随Tableview 滚动

 

当tableview的类型为 plain的时候,header View 就会停留在最上面。

 

当类型为 group的时候,header view 就会跟随tableview 一起滚动了。

 

五十五、TabBar的title 设置

 

在xib 或 storyboard 中可以进行tabBar的设置

 

技术分享

 

其中badge 是自带的在图标上添加一个角标。

 

1. self.navigationItem.title 设置navigation的title 需要用这个进行设置。

 

2. self.title 在tab bar的主VC 中,进行设置self.title 会导致navigation 的title 和 tab bar的title一起被修改。

 

五十六、UITabBar,移除顶部的阴影

 

添加这两行代码:

 

[[UITabBar appearance] setShadowImage:[[UIImage alloc] init]];

[[UITabBar appearance] setBackgroundImage:[[UIImage alloc] init]];

 

顶部的阴影是在UIWindow上的,所以不能简单的设置就去除。

 

五十七、当一行中,多个UIKit 都是动态的宽度设置

 

技术分享

 

设置horizontal的值,表示出现内容很长的时候,优先压缩这个UIKit。

 

五十八、JSON的“” 转换为nil

 

使用AFNetworking 时, 使用

 

AFJSONResponseSerializer *response = [[AFJSONResponseSerializer alloc] init];

response.removesKeysWithNullValues = YES;

 

_sharedClient.responseSerializer = response;

 

这个参数 removesKeysWithNullValues 可以将null的值删除,那么就Value为nil了

 

 END

 

写吐了,那么长应该是没人会看完的,看完了算你狠。

iOS开发经验总结(下)

标签:

原文地址:http://www.cnblogs.com/fengmin/p/5478422.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!