iOS开发经验总结(下)

iOS开发经验总结(下)


四十、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 只能输入数字,不能切换到其他输入


    iOS开发经验总结(下)_第1张图片


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

    iOS开发经验总结(下)_第2张图片


四十五、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的设置


iOS开发经验总结(下)_第3张图片


其中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开发经验总结下)