zoukankan      html  css  js  c++  java
  • 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 只能输入数字,不能切换到其他输入

    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

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

  • 相关阅读:
    Spring 框架的设计理念与设计模式分析
    stratos paas平台
    云计算国际标准
    如何在KVM中管理存储池
    深度学习(四) softmax函数
    深度学习(二)BP求解过程和梯度下降
    深度学习(一) BP神经网络
    提交代码到git
    Mac 安装tensorflow
    Mac 安装Git
  • 原文地址:https://www.cnblogs.com/fengmin/p/5478422.html
Copyright © 2011-2022 走看看