ios开发问题总结
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.jpeg3、关于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];
}
有新问题会持续更新······(以前遇到很多问题,解决了就解决了,后来就忘了,慢慢记录吧)