ios开发问题总结

作者: 乔兰伊雪 | 来源:发表于2017-12-26 17:52 被阅读691次
    1、imageView的UIViewContentMode几种模式说明,根据具体内容选择相应的模式,保证图片不变形
    typedef NS_ENUM(NSInteger, UIViewContentMode) {
        //图片拉伸填充至整个UIImageView(图片可能会变形),这也是默认的属性,如果什么都不设置就是它在起作用
        UIViewContentModeScaleToFill,
        //图片拉伸至完全显示在UIImageView里面为止(图片不会变形)
        UIViewContentModeScaleAspectFit,
        //图片拉伸至图片的的宽度或者高度等于UIImageView的宽度或者高度为止.看图片的宽高哪一边最接近UIImageView的宽高,一个属性相等后另一个就停止拉伸.
        UIViewContentModeScaleAspectFill,
        //调用setNeedsDisplay 方法时,就会重新渲染图片
        //下面的属性都是不会拉伸图片的
        UIViewContentModeRedraw,
        //中间模式
        UIViewContentModeCenter,
        //顶部
        UIViewContentModeTop,
        //底部
        UIViewContentModeBottom,
        //左边
        UIViewContentModeLeft,
        //右边
        UIViewContentModeRight,
        //左上
        UIViewContentModeTopLeft,
        //右上
        UIViewContentModeTopRight,
        //左下
        UIViewContentModeBottomLeft,
        //右下
        UIViewContentModeBottomRight,
    };
    
    2、xcode9.2打包的ipa或者直接用xcode在ios9以下系统的手机上运行,app内所有图片都撕裂变形,显示异常,如图,目前我还不清楚原因是什么(💧💧💧),解决办法是用xcode9.1及以下打包app,可能是xcode9.2里面有什么东西影响了ios9以下系统显示图片,还是有不少伙伴遇到了这个问题的
    WechatIMG30.jpeg
    3、关于layout的一些问题

    放一个链接供大家参考:谈谈UIView的几个layout方法
    遇到的问题:我的tabview的header高度是不固定的,每次刷新后会根据内容重设header的高度,header的子view是自动布局,在ios10以上系统运行的时候,app一切显示正常,在ios9上面运行的时候header的子view位置显示正常,但是高度依然是初始高度,造成header高度不够,子view超出header跟cell重合,页面混乱。
    之后了解到重设view的Frame会触发layoutSubviews,但在高系统版本上会自动调用layoutifneed,让页面改动立即生效显示正常,低系统版本需要自己手动调用[tabview layoutIfNeeded];才会正常

    4、使用wkwebview时,push后,再pop返回,报错了:
    Cannot form weak reference to instance (xxxx) of class xxxx. It is possible that this object was over-released, or is in the process of deallocation.
    

    原因是给webView.scrollView设置了代理:webView.scrollView.delegate = self ;
    解决办法:

    -(void)dealloc
    {
        webView.scrollView.delegate = nil;
    }
    
    5、修改UIDatePicker和UIPickerView的字体颜色和分割线颜色

    设置颜色,对两个都有效
    [_datePicker setValue:[UIColor whiteColor] forKey:@"textColor"];
    设置分割线颜色,只对UIPickerView有效

    [pickerView.subviews enumerateObjectsUsingBlock:^(__kindof UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
            if (obj.frame.size.height <=1) {
                obj.backgroundColor = WhiteColor;
            }
        }];
    

    设置UIDatePicker分割线,用view替换,虽然比较笨但是比较有效(上面那个办法不管用,分割线颜色又必须得改,我就用UIPickerView自己写了个DatePicker,能够设置最大日期和最小日期,但是功能还是不如原生的好,后来发现下面这个笨办法)

    for (UIView *view in _datePicker.subviews) {
            if ([view isKindOfClass:[UIView class]]) {
                for (UIView *subView in view.subviews) {
                    if (subView.frame.size.height <=5) {
                        UIView *redLine = [[UIView alloc] initWithFrame:subView.bounds];
                        redLine.backgroundColor = WhiteColor;
                        [subView addSubview:redLine];
                    }
                }
            }
        }
    
    6、编译报错library not found for -xxx 去other link里面删掉xxx即可

    有些三方库一开始用cocopods导入,后来删掉,然后直接拖入工程,编译的时候也会报类似错误,同样办法去other link删掉就好了

    7、这个问题遇到的人很多,出现的原因也不少
    invalid mode 'kCFRunLoopCommonModes' provided to CFRunLoopRunSpecific - break on _CFRunLoopError_RunCalledWithInvalidMode to debug. This message will only appear once per execution.
    

    1、注册和重用时的重用标志符写的不一样
    2、 Umeng 数据统计的原因,关闭了友盟的打印功能就好了
    3、iOS9.0以后 苹果避免在进行根试图之前有复杂的操所以先设置一个空的根试图
    self.window.rootViewController = [[UIViewController alloc] init];
    我是第一种

    8、linker command failed with exit code 1

    原因和解决办法:
    1、看看是不是有新添加的文件跟之前文件同名
    2、错误信息中出现了某个类的名字,去原文件中看看#import了哪些第三方库,把这些库挨个注释排除,找到出错的那个库,然后按照官方提供的步骤重新添加一遍。
    3、SVN或git忽略了某些文件,如.o 等文件没能update下来,查看.o文件可能是红色的,可以重新添加或者修改SVN(git)的忽略设置
    4、把.a文件删除再重新拖到项目中解决问题
    5、可能重复添加了文件(也可能没勾选 Copy items if neded 这个选项),建议删除后重新添加
    6、工程中文件名重复了 也会出现同样的错误
    7、Build Settings”->”Enable Bitcode”设置为NO ,因为有些SDK不支持Bitcode
    8、可能在引用的时候 可能写的是#import “XXXXX.m” ,如果是改为#import “XXXXX.h”
    9、可能你导入的SDK只能在真机下才能运行,模拟器会报错!
    10、找到 Build settings->Linking->Other Linker Flags将此属性修改成-all_load 或者 -ObjC
    11、Build settings->Search Path->Library Search Paths 添加静态库的相应路径

    9、ios11 estimatedRowHeight

    关于ios11适配的文章有很多,适配代码基本如下:

            //关闭预估高度-尤其使用MJ的时候要用    
            self.estimatedRowHeight = 0;
            //footer和header的预估高度-如果没有的话也关闭
            self.estimatedSectionHeaderHeight = 0;
            self.estimatedSectionFooterHeight = 0;
            //适配ios11自适应上导航 安全区域
            SEL selector = NSSelectorFromString(@"setContentInsetAdjustmentBehavior:");
            if ([self respondsToSelector:selector]) {
                IMP imp = [self methodForSelector:selector];
                void (*func)(id, SEL, NSInteger) = (void *)imp;
                func(self, selector, 2);
            }
    

    estimatedRowHeight原理总结:当你的实际高度大于预估高度的时候,会按照预估高度下的cell的数量来计算contentSize,当实际高度小于预估高度的时候,会按照实际高度下的cell的数量来计算contentSize。参考:关于iOS11中estimatedRowHeight

    使用MJRefresh时,底部上拉加载是根据contentSize来计算的,当数据更新的时候,得出来的contentSize只是预估的,会有错位现象,需要关闭预估高度
    10、iphoneX适配

    几个宏

    //是否iPhonex
    #define kDevice_Is_iPhoneX ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(1125, 2436), [[UIScreen mainScreen] currentMode].size) : NO)
    //是否ios11
    #define IS_IOS_11 (([[[[UIDevice currentDevice].systemVersion componentsSeparatedByString:@"."] objectAtIndex:0] intValue] >= 11) ? YES : NO)
    //下导航高度
    #define kTabbarHeight ((kDevice_Is_iPhoneX==NO)?49.0:83.0)
    //上导航高度
    #define kNavHeight ((kDevice_Is_iPhoneX==NO)?64.0:88.0)
    //iphonex底部半圆区域高度-此高度内不建议显示内容,尤其用tableview的时候最后一个cell会显示不全,可以根据是否x判断tableview的contentInset,滚动的时候全屏滚动,显示的时候底部区域不显示
    //例如:self.contentInset = UIEdgeInsetsMake(0, 0, kbottomHeight, 0);
    #define kbottomHeight ((kDevice_Is_iPhoneX==NO)?0:34)
    
    iphonex上面push下导航会上移的问题解决办法:在UINavigationController的基类重写pushViewController代理方法,在Push的时候修正一下TabBar的frame
    - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
    {
        if (self.viewControllers.count > 0) {
            if ([viewController conformsToProtocol:@protocol(XYTransitionProtocol)] && [self isNeedTransition:viewController]) {
                viewController.hidesBottomBarWhenPushed = NO;
            }else{
                viewController.hidesBottomBarWhenPushed = YES;
            }
            
        }
        [super pushViewController:viewController animated:animated];
        // 修改tabBra的frame
        CGRect frame = self.tabBarController.tabBar.frame;
        frame.origin.y = [UIScreen mainScreen].bounds.size.height - frame.size.height;
        self.tabBarController.tabBar.frame = frame;
    }
    

    适配参考:
    适配iOS11&iPhoneX的一些坑
    适配 iPhone X Push 过程中 TabBar 位置上移
    IOS11 适配遇到的坑

    11、设置headerInsectionView不悬浮

    UITableView的Style为Plain时,当tableView上移顶端的tableHeaderView会跟着滑出窗口,而sectionheader则会悬浮固定在窗口顶端不随着滑动继续上移。
    UITableView的Style为Grouped时,当tableView上移顶端的tableHeaderView会跟着滑出窗口,而sectionheader则会随着滑动继续上移。

    //UITableView的Style为Plain时禁止headerInsectionView固定在顶端:
    - (void)[scrollView](http://zhannei.baidu.com/cse/search?s=6675880828571631723&entry=1&q=scrollView)DidScroll:(UIScrollView *)scrollView {
        CGFloat sectionHeaderHeight = 50;
        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);
        }
    }
    
    12、Xcode报错You don’t have permission.
    有的说改这里

    有的说是因为添加了一个文件夹,文件夹内也有一个plist跟工程的冲突了,删掉即可
    我的问题就是删掉了文件夹内plist就解决了

    13、打包,准备提交审核遇到的问题:Virtual filesystem overlay file /......build/all-product-headers.yaml' not fou

    打包,准备提交审核遇到的问题,如下所示错误信息。

    Virtual filesystem overlay file '/Users/tusm/Library/Developer/Xcode/DerivedData/OfficeTest-gmxanjoqrrzbdebizuzhdwimkyhk/Build/Intermediates/ArchiveIntermediates/OfficeTest/IntermediateBuildFilesPath/OfficeTest.build/all-product-headers.yaml' not found

    修改build版本号,大于之前的版本号重新提交即可

    14、网络请求错误码对应内容
      kCFURLErrorUnknown   = -998,
      kCFURLErrorCancelled = -999,
      kCFURLErrorBadURL    = -1000,
      kCFURLErrorTimedOut  = -1001,
      kCFURLErrorUnsupportedURL = -1002,
      kCFURLErrorCannotFindHost = -1003,
      kCFURLErrorCannotConnectToHost    = -1004,
      kCFURLErrorNetworkConnectionLost  = -1005,
      kCFURLErrorDNSLookupFailed        = -1006,
      kCFURLErrorHTTPTooManyRedirects   = -1007,
      kCFURLErrorResourceUnavailable    = -1008,
      kCFURLErrorNotConnectedToInternet = -1009,
      kCFURLErrorRedirectToNonExistentLocation = -1010,
      kCFURLErrorBadServerResponse             = -1011,
      kCFURLErrorUserCancelledAuthentication   = -1012,
      kCFURLErrorUserAuthenticationRequired    = -1013,
      kCFURLErrorZeroByteResource        = -1014,
      kCFURLErrorCannotDecodeRawData     = -1015,
      kCFURLErrorCannotDecodeContentData = -1016,
      kCFURLErrorCannotParseResponse     = -1017,
      kCFURLErrorInternationalRoamingOff = -1018,
      kCFURLErrorCallIsActive               = -1019,
      kCFURLErrorDataNotAllowed             = -1020,
      kCFURLErrorRequestBodyStreamExhausted = -1021,
      kCFURLErrorFileDoesNotExist           = -1100,
      kCFURLErrorFileIsDirectory            = -1101,
      kCFURLErrorNoPermissionsToReadFile    = -1102,
      kCFURLErrorDataLengthExceedsMaximum   = -1103,
    
    15、CABasicAnimation 按home键后台之后,再切回来动画就停止

    CABasicAnimation有个属性removedOnCompletion,默认值为YES,意思是动画在指定时间段内完成后,就会从层上自动移除。

    如果CABasicAnimation 按home键后台之后,再切回来动画就停止,只要将removedOnCompletion属性设为no动画就不会停止,直到你移除该动画
    16、iOS视频播放AVPlayer的视频内容拉伸设置

    AVPlayer有个属性videoGravity,可以设置视频的拉伸方式

    AVLayerVideoGravityResizeAspect//在边界内保持纵横比,使视频完整显示,两边会留黑
    AVLayerVideoGravityResizeAspectFill//保持纵横比填满边界,内容会超出边界,超出部分被截掉
    AVLayerVideoGravityResize//拉伸填满边界,视频会变形
    

    根据具体需求设置该属性,比如我在仿抖音的时候,播放的视频都是全屏的,不能留黑边,又不能让视频变形,我设置的是AVLayerVideoGravityResizeAspectFill,它是以宽度等比例拉伸,高度超出屏幕的上下部分就被裁掉,应该不太影响视频观看效果

    17、意外警告

    收到 This block declaration is not a prototype
    Insert ‘void’ 这个警告
    解决办法:
    Build Settings -> Strict Prototypes 设置为NO即可, 这只是个临时方案.

    18、创建新的颜色

    通常我们会 New image set, xcode9以后可以 New color set, 然后填充 rgb alpha 值,

    Assets.xcassets -> + -> New color set-> 填充RGB及alpha即可
    使用方法:

       UIColor *customColor;
        // colorNamed: iOS11才有的, 要做版本判断.
        if (@available(iOS 11, *)) { 
            // customColor是自定义颜色的文件名字.
            customColor = [UIColor colorNamed:@"customColor"]; 
        } else {
            customColor = [UIColor colorWithRed:1 green:0.427 blue:1.0 alpha:1.0];
        }
    

    有新问题会持续更新······(以前遇到很多问题,解决了就解决了,后来就忘了,慢慢记录吧)

    相关文章

      网友评论

      本文标题:ios开发问题总结

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