在微博上看了好久的 iOS 知识小集,真的获益匪浅,谢谢那些开发者们,让我们的工作更加有效率;大家可以在微博里面查看 微博话题 #iOS知识小集#,也可以微信搜索公众号 知识小集,另外大佬们也将小集的内容归档了,在 github 以及英文版 medium 大家喜欢的可以去查看。
我本身也喜欢在工作过程中记录一些我碰到的 小问题
,感觉也可以写一波出来,后面会慢慢更新出来给大家。
设置屏幕常亮
设为YES则保持常亮,不自动锁屏,默认为NO会自动锁屏
[[UIApplication sharedApplication] setIdleTimerDisabled:YES];
常用的单元测试 assert
XCTFail(format…) 生成一个失败的测试;
XCTAssertNil(a1, format...)为空判断,a1为空时通过,反之不通过;
XCTAssertNotNil(a1, format…)不为空判断,a1不为空时通过,反之不通过;
XCTAssert(expression, format...)当expression求值为TRUE时通过;
XCTAssertTrue(expression, format...)当expression求值为TRUE时通过;
XCTAssertFalse(expression, format...)当expression求值为False时通过;
XCTAssertEqualObjects(a1, a2, format...)判断相等,[a1 isEqual:a2]值为TRUE时通过,其中一个不为空时,不通过;
XCTAssertNotEqualObjects(a1, a2, format...)判断不等,[a1 isEqual:a2]值为False时通过;
XCTAssertEqual(a1, a2, format...)判断相等(当a1和a2是 C语言标量、结构体或联合体时使用, 判断的是变量的地址,如果地址相同则返回TRUE,否则返回NO);
XCTAssertNotEqual(a1, a2, format...)判断不等(当a1和a2是 C语言标量、结构体或联合体时使用);
XCTAssertEqualWithAccuracy(a1, a2, accuracy, format...)判断相等,(double或float类型)提供一个误差范围,当在误差范围(+/-accuracy)以内相等时通过测试;
XCTAssertNotEqualWithAccuracy(a1, a2, accuracy, format...) 判断不等,(double或float类型)提供一个误差范围,当在误差范围以内不等时通过测试;
XCTAssertThrows(expression, format...)异常测试,当expression发生异常时通过;反之不通过;(很变态) XCTAssertThrowsSpecific(expression, specificException, format...) 异常测试,当expression发生specificException异常时通过;反之发生其他异常或不发生异常均不通过;
XCTAssertThrowsSpecificNamed(expression, specificException, exception_name, format...)异常测试,当expression发生具体异常、具体异常名称的异常时通过测试,反之不通过;
XCTAssertNoThrow(expression, format…)异常测试,当expression没有发生异常时通过测试;
XCTAssertNoThrowSpecific(expression, specificException, format...)异常测试,当expression没有发生具体异常、具体异常名称的异常时通过测试,反之不通过;
XCTAssertNoThrowSpecificNamed(expression, specificException, exception_name, format...)异常测试,当expression没有发生具体异常、具体异常名称的异常时通过测试,反之不通过
消除 pad 上tableView分割线的问题
在工作做碰到了,在 iOS
上可以正常运行,但是在 iPad
上运行的时候,tableView
的分割线的宽度不等于整个 cell
的宽度,需要在 cellwilldisplay
或者是 cellForRowAtIndexPath
方法中加上以下代码:
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
if ([cell respondsToSelector:@selector(setSeparatorInset:)]){
[cell setSeparatorInset:UIEdgeInsetsMake(0, -1000, 0, -1000)];
}
tableView 自适应高度
iOS8 之后才有的,在 tableView中设置以下属性,即可实现 cell 自适应高度,不过前提是使用 autolayout 并且约束要设置正确
tableView.estimatedRowHeight = 145;
tableView.rowHeight = UITableViewAutomaticDimension;
不过我在使用这个的时候,也是碰到了一些问题的:
1. 我使用的控制器是继承了 QMUI 的 QMCommonTableViewController 父类在内部做了一些处理,导致设置 UITableViewAutomaticDimension 的时候失效
2. 如果你使用这个,在做好约束之后,如果 UI 有改动的话,你需要将整个 cell 的约束全部重做,我当时反正是改了一些数值之后,约束就一直报红,只有重做才可以,如果你知道是什么问题,希望你能告诉我
所以,我建议大家对于这种整体的框架类还是少使用基础基类,如果使用,最好也别用第三方的,而是使用自己有做过简单封装的,另外记得写好注释告诉后面的人怎么使用这些基础基类。
UITableView 多选背景色和黑色线条问题
当做多选需求时,碰到过使用 UITableView
的多选时,要么选择那块的背景色不变或者是多选那块顶部有一条黑色的线,发现将 UITableView
的 allowsMultipleSelectionDuringEditing
设置为YES
即可解决此问题
const 修饰不同的位置
这个就是一个记录,因为有时候会忘记,但是在面试的时候,偶尔会碰到
1.const NSString *string = @"AppleTTT";
"*string"不能被修改, "string"能被修改
2.NSString const *string = @"AppleTTT";
"*string"不能被修改, "string"能被修改
3.NSString * const string = @"AppleTTT";
"string"不能被修改,"*string"能被修改
结论:const右边的总不能被修改
所以一般我们定义一个常量又不想被修改应该这样:NSString * const string = @"AppleTTT";
停止View的动画
在执行动画的View的layer使用 removeAnimation 方法
__bridge,__bridge_retained和__bridge_transfer
参考
__bridge
: 只做类型转换,但是不修改对象(内存)管理权;
__bridge_retained
: (也可以使用 CFBridgingRetain
)将 Objective-C
的对象转换为 Core Foundation
的对象,同时将对象(内存)的管理权交给我们,后续需要使用CFRelease或者相关方法来释放对象;
__bridge_transfer
: (也可以使用 CFBridgingRelease
)将 Core Foundation
的对象转换为Objective-C的对象,同时将对象(内存)的管理权交给ARC。
tableView 修改系统默认多选时的图片和颜色
修改TableViewCell在编辑模式下选中按钮的图片,在 cell
中添加如下代码
- (void)layoutSubviews {
[super layoutSubviews];
for (UIControl *control in self.subviews) {
if (![control isMemberOfClass:NSClassFromString(@"UITableViewCellEditControl")]){ continue; }
for (UIView *subView in control.subviews) {
if (![subView isKindOfClass: [UIImageView class]]) { continue; }
UIImageView *imageView = (UIImageView *)subView;
if (self.selected) {
imageView.image = [UIImage imageNamed:@"check_selected"]; // 选中时的图片
} else {
imageView.image = [UIImage imageNamed:@"check_normal"]; // 未选中时的图片
}
}
}
}
修改TableViewCell在编辑模式下选中按钮的颜色
- (void)layoutSubviews
{
[super layoutSubviews];
for (UIControl *control in self.subviews) {
if (![control isMemberOfClass:NSClassFromString(@"UITableViewCellEditControl")]){ continue; }
for (UIView *subView in control.subviews) {
if (![subView isKindOfClass: [UIImageView class]]) { continue; }
UIImageView *imageView = (UIImageView *)subView;
if (self.selected) {
// KVC修改
[imageView setValue:kNavBarColor forKey:@"tintColor"]; // 选中时的颜色
} else {
[imageView setValue:kGrayTextColor forKey:@"tintColor"]; // 未选中时的颜色(貌似没用?)
}
}
}
}
网友评论