美文网首页开发实战iOS Developerios实用开发技巧
项目开发中所遇到的问题总结(不定期更新......)

项目开发中所遇到的问题总结(不定期更新......)

作者: 西风颂 | 来源:发表于2016-11-18 12:28 被阅读96次

    1.Plain类型的 UITableView 隐藏多余 cell 的分割线问题

    //隐藏多余的 cell 的分割线
    self.mainTableView.tableFooterView = [[UIView alloc] init];
    //然后可以向 tableView 的背景颜色设置为 clearColor
    

    2.判断当前ViewController是push还是present的方式显示的

    NSArray *viewcontrollers = self.navigationController.viewControllers;
    if (viewcontrollers.count > 1){
        if ([viewcontrollers objectAtIndex:viewcontrollers.count - 1] == self){
            //push方式
           [self.navigationController popViewControllerAnimated:YES];
        }
    }else{
        //present方式
        [self dismissViewControllerAnimated:YES completion:nil];
    }
    

    3.启动图问题

    优先级:LaunchScreen > LaunchImage
    在xcode 中设置启动图的时候不起作用;
    1.清空 xcode 的缓存;
    2.直接删掉程序直接运行;

    注意:如果是通过LaunchImage设置启动界面,那么屏幕的的可视范围由图片决定;因此如果使用LaunchImage作为启动图片必须让美工提供所有尺寸的启动图片;

    LaunchScreen是在 xcode6之后才出来的; LaunchScreen的好处:1.自动识别当前真机的或者模拟器的尺寸;
    2.只让美工提供一个可拉伸的图片即可;
    3.展示更多东西;

    LaunchScreen的底层实现:把LaunchScreen截屏,生成一张图片作为启动图片;

    4. iOS之用NSTimer定时刷新按钮的文字,避免按钮闪烁的办法

    解决方法:
    将UIButton的类型由system改为custom就OK拉!

    5.UIAppearance使用注意

    1.UIAppearance:只有遵守这个协议,才能拿到全局的;
    2.并不是所有属性都能通过UIAppearance设置,必须要有UI_APPEARANCE_SELECTOR这个宏才可以设置;
    3.UIAppearance最好在显示之前使用,否则没有效果.一般在+ loaddata( )方法中调用;
    4.一般不直接使用:[UITabBarItem appearance]这个方法,因为没有遵循自己的东西自己管理的原则;直接调用这个方法的时候是设置全局的样式,容易引发一些其他问题;因此一般调用这个方法:[UITabBarItem appearanceWhenContainedIn:self, nil],这样可以达到只修改当前类中的样式;
    使用场景:夜间模式

    6.UIScrollView的约束添加注意事项

    在 AutoLayout 中,所有的间距类约束并非是相对于父控件本身的,而是先对控件的内容视图的(如: UIScrollView 的 ContentSize); 由于普通的 view 的内容视图与本身的大小是一样的,所以可以看成相对于 view 本身;但是 UIScrollView 在加载的时候,会自动根据内部子控件来计算 ContentSize 的值;
    宽高类的约束是相对于 view 本身的, 并非相对于它的内容视图的,所以相对于 scrollview 的来说, 其本身的 view 的宽高有多大就有多大,与 ContentSize 的大小无关;

    7.自定义 UITabBar 的时候注意事项

    在自定义 TabBar 的时候添加子控制器的时候要使用 self.viewControllers = @[nav1,nav2,nav3,nav4];
    如果使用 [self addChildViewController:nav];添加的话还是会生成系统的 TabBar;

    8.iOS10新特性

    1.证书设置问题。
    2.RGB到sRGB的转变,UIColor多增加两个方法。提高了对扩展像素和宽色域色彩空间的支持。
    3.系统文件的访问设置变化。系统隐身数据访问问题。
    4.系统版本判断方法失效。
    5.真彩色的显示。
    6.字体的变化,iOS10字体变大。
    7.UIStatusBar设置问题。
    8.UICollectionView生命周期的变化和性能的优化,新增一个代理协议,两个代理方法。
    9.UIRefreshControl脱离控制器,直接是UIScrollView的一个属性。
    10.UITextField添加contenttype字段。
    11.debug输出不相关信息。
    12.通知中心的整体API变化。

    9.UITableView的plain样式下,取消区头停滞效果

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView
    {
        CGFloat sectionHeaderHeight = sectionHead.height;
        if (scrollView.contentOffset.y<=sectionHeaderHeight&&scrollView;.contentOffset.y>=0){
            scrollView.contentInset = UIEdgeInsetsMake(-scrollView.contentOffset.y, 0, 0, 0);
        }else if(scrollView.contentOffset.y>=sectionHeaderHeight){
            scrollView.contentInset = UIEdgeInsetsMake(-sectionHeaderHeight, 0, 0, 0);
        }
    }
    

    10.isKindOfClass和isMemberOfClass的区别

    isKindOfClass 方法内部会先去获得object_getClass的类,而object_getClass的源码实现是去调用当前类的obj_getIsa(),最后在ISA()方法中获得meta class的指针,接着在isKindOfClass 中有一个循环,先判断class是否等于meta class,不等就继续循环判断是否等于super class,不等再继续取super class,如此继续遍历;

    isMemberOfClass的源码实现是拿到自己的ISA指针和自己比较是否相等;

    11. 遍历不定长的数据, 比如 (NSString *)buttonTitles, ... 和AlertView最后的一个参数一样.

    if (buttonTitles) {
        NSMutableArray *buttons = [NSMutableArray array];
        va_list argList;
        va_start(argList, buttonTitles);
        for (id str = buttonTitles; str != nil; str = va_arg(argList, id)) {
            UIButton *button = [[UIButton alloc] init];
            [button setTitleColor:[UIColor colorWithWhite:1 alpha:0.5] forState:UIControlStateNormal];
            [button setTitleColor:[UIColor whiteColor] forState:UIControlStateSelected];
            [button setBackgroundImage:nil forState:UIControlStateSelected];
            [button setTitle:(NSString *)str forState:UIControlStateNormal];
            [button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];
            [self addSubview:button];
            [buttons addObject:button];
        }
        va_end(argList);
    }
    

    12. 异常捕获

    在APPDelegate中 NSSetUncaughtExceptionHandler (&UncaughtExceptionHandler);
    实现 void UncaughtExceptionHandler()方法

    void UncaughtExceptionHandler(NSException *exception) {
        NSArray *arr = [exception callStackSymbols];//得到当前调用栈信息
        NSString *reason = [exception reason];//非常重要,就是崩溃的原因
        NSString *name = [exception name];//异常类型
        NSLog(@"exception type : %@ \n crash reason : %@ \n call stack info : %@", name, reason, arr);
    }
    

    13.使用CoacoaPod的问题

    在使用Cocoapod之前,项目中的第三方都是手动导入的,加入Cocoapods后我首先把原来项目中的Masonry删掉了,然后通过pod来导入,导入后编译没有任何问题,但是运行后立刻Crash,错误是UI控件找不到Masonry中的方法unrecognized selector sent to instance xxxxxx,而方法确实是存在的。
    后来找到的解决方法是:

    1、打开工程所在文件夹,找到.xcodeproj文件,右键选择【显示包内容】,找到project.pbxproj文件
    2、打开project.pbxproj文件,查找OTHER_LDFLAGS,把和这个相关的内容都删除
    4、重新编译并运行

    14.使用CATextLayer编辑文字的时候,文字显示模糊的问题

    使用contentsScale属性可以让其显示不模糊;

    textLayer.contentsScale = [UIScreen mainScreen].scale;
    

    15.在xcode控制台中输入lldb命令时不输出的问题

    问题描述

     Stopped in a context claiming to capture an Objective-C object pointer, but 'self' isn't available
    

    解决办法:
    设置项目工程中的Precompile Prefix Header的为NO即可;

    16.UICollectionViewCell点击不走代理方法注意点:

    在cell上面添加button的时候容易拦截点击事件从而引起cell不走点击的代理;

    17.bitcode导致的编译错误linker command failed with exit code 1 (use -v to see invocation)

    有些第三方库不支持bitcode所以编译会报错;在项目设置中将bitcode关闭即可;(有时可能模拟器可以但是真机不可以);

    18.当两个数相除分母为0的时候其结果等于nan;

    19.在使用view的缩放的时候,layer.border.width随着view的放大,会出现锯齿化的问题,解决这个问题需要设置这个属性。

    self.layer.allowsEdgeAntialiasing = YES;
    

    20. 打印应用启动时间

    对于pre-main阶段,Apple提供了一种测量方法,在 Xcode 中 Edit scheme -> Run -> Auguments 将环境变量DYLD_PRINT_STATISTICS 设为1 ;打印启动时间;

    21.iOS中系统导航手势返回右上角有黑色背景问题解决

    UITabBarController的view的背景颜色设置为白色即可;

    相关文章

      网友评论

        本文标题:项目开发中所遇到的问题总结(不定期更新......)

        本文链接:https://www.haomeiwen.com/subject/oxviyttx.html