updateConstraints
和layoutSubviews
的关系有点像,收集-实施的关系。(准备数据、使用数据)bash
触发layoutSubviews的方式:布局
initialize中 坐标计算,使用static变量只计算一次ui
initWithFrame:中spa
组装subviewcode
setModel中cdn
配置数据源,needLayoutblog
layoutSubviews中继承
处理布局生命周期
注意有些第三方库的view,可能没有实现layoutSubviews,而是重写了setFrame:,若是咱们的View以他们为subview了, 要注意:事件
深度优先: 父视图,有兄弟视图的状况下,先绘制父视图,而后绘制父视图的子视图,最后绘制兄弟视图。
//比superview准确,用superview的话,要判断navigationController和tabbarController
- (UIViewController *)viewController {
UIResponder *responder = self;
while (![responder isKindOfClass:[UIViewController class]]) {
responder = [responder nextResponder];
if (nil == responder) {
break;
}
}
return (UIViewController *)responder;
}
复制代码
//1. alpha,hidden。较少用,opaque。
//2. opacity,layer的属性,至关于view.alpha,但设置为0,也不影响事件响应。
复制代码
以上都会影响子视图(或子layer),若是但愿父视图透明,子视图不透明。
//只对颜色有效,对图片无效
superView.backgroundColor = [[UIColor lightGrayColor] colorWithAlphaComponent:0.5];
复制代码
//效果上没区别
view.clipsToBounds = YES;
layer.masksToBounds = YES;
复制代码
//1. sizeToFit,在autoLayout中无效了,要强行生效,能够写在viewDidLayoutSubviews中
//2. tintColor,默认背景色,会被子类继承
//3. multipleTouchEnabled,是否开启多点触摸,默认NO
//4. exclusiveTouch,事件独占,默认NO
表示事件独占,若是UIView是事件的firstResponder,那么第一个手指离开前,其余视图不会响应任何触摸事件。(仅Touch事件,不包括手势)
iOS 解决页面按钮同时点击,同时触发问题 设置全部UIButton的ExclusiveTouch属性为YES
-(void)setExclusiveTouchForButtons:(UIView *)myView {
for (UIView * v in [myView subviews]) {
if([v isKindOfClass:[UIButton class]])
[((UIButton *)v) setExclusiveTouch:YES];
else if ([v isKindOfClass:[UIView class]]){
[self setExclusiveTouchForButtons:v];
}
}
}
//5. 根据tag拿view
viewWithTag:
//6. 是否为子视图
isDescendantOfView:
//7.层级、响应相关
insertSubview:belowSubview:
insertSubview:aboveSubview:
becomeFirstResponder
resignFirstResponder
bringSubviewToFront:
sendSubviewToBack:
//8. sizeToFit,会被autoLayout覆盖(除非在viewDidLayoutSubviews中调用,不推荐),不须要太在乎这个属性
sizeToFit //不要重写,可能会改变原始frame
siztThatFits //重写这个,为sizeToFit提供数据,"照这个数据fit"
//9. 刷新相关
setNeedsUpdateConstraints
updateConstraintsIfNeeded
setNeedsLayout
layoutIfNeeded
setNeedsDisplay
复制代码