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的背景颜色设置为白色即可;