1. 系统方法用法总结
1.
layoutSubviews: 默认没有做任何事情,UIView子类中重写;
1.1addSubview会触发, 如果view的frame不为CGRectZero则会再次触发;
1.2 已经被addSubview后, 调整其frame也会触发;
1.3 滚动, 旋转也会触发;2.
setNeedsLayout: 当一个UIView对象调用此方法时, 相当于做了一个标记, 告知需要重新布局, 当前runloop周期结束后会调用layoutSubviews;3.
layoutIfNeeded: 如果布局(frame,bounds)发生变化或者有(setNeedsLayout)标记, 调用此方法会强制立即调用layoutSubviews;4.
drawRect: 重写UIView类的此方法进行绘图操作, 在此方法中获取图形上下文进行绘图渲染;5.
setNeedsDisplay: 标记为需要为重绘, 合适时机调用drawRect;6.
setNeedsDisplayInRect: 标记为局部需要重绘, 合适时机调用drawRect;-
7.
sizeToFit: 计算出最优的size并且改变自己的size;UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 0, 0)]; [label setBackgroundColor:[UIColor grayColor]]; [label setFont:[UIFont systemFontOfSize:20]]; label.text = @"Test"; #sizeToFit:直接改变了这个label的宽和高,使它根据上面字符串的大小做合适的改变 [label sizeToFit]; NSLog(@"width=%.1f height=%.1f ", label.frame.size.width, label.frame.size.height); [self.view addSubview:label]; #打印结果: 2020-08-25 18:26:29.796009+0800 ViewLayout[2340:264781] width=36.5 height=24.0 -
8.
sizeThatFits算出最优的size但是不会改变自己size;UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 0, 0)]; [label setBackgroundColor:[UIColor grayColor]]; [label setFont:[UIFont systemFontOfSize:20]]; label.text = @"Test"; #sizeThatFits并没有改变原始label的大小 CGSize sizeThatFits = [label sizeThatFits:CGSizeZero]; NSLog(@"sizeThatFits: width=%.1f height=%.1f", sizeThatFits.width, sizeThatFits.height); NSLog(@"width=%.1f height=%.1f", label.frame.size.width, label.frame.size.height); [self.view addSubview:label]; 2020-08-25 18:28:56.611497+0800 ViewLayout[2347:265814] sizeThatFits: width=36.5 height=24.0 2020-08-25 18:28:56.611571+0800 ViewLayout[2347:265814] width=0.0 height=0.0