美文网首页
iOS 小知识1

iOS 小知识1

作者: AppleTTT | 来源:发表于2018-04-04 10:31 被阅读232次

在微博上看了好久的 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 的多选时,要么选择那块的背景色不变或者是多选那块顶部有一条黑色的线,发现将 UITableViewallowsMultipleSelectionDuringEditing 设置为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"]; // 未选中时的颜色(貌似没用?)  
            }  
        }  
    }  
} 

相关文章

网友评论

      本文标题:iOS 小知识1

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