iOS开发iOS学习专题程序员

ios开发问题总结

2017-12-26  本文已影响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];
    }

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

上一篇下一篇

猜你喜欢

热点阅读