前言:大家都知道UIViewController在自己生命周期的各个阶段都有函数回调,我们经常在不同阶段的回调中,添加业务逻辑,完成不同的操作。同样,UIView也有自己的生命周期,在它的生命周期的各个阶段,也会伴随相关的回调。本文更像是一片总结性的随笔,着实没有写太深奥的知识,只是简单阐述了UIView的生命周期函数,以便满足特定的场景下业务需求实现。
1、生命周期方法:
didAddSubview:、willRemoveSubview:、
willMoveToSuperview:、didMoveToSuperview、
willMoveToWindow:、didMoveToWindow
UIView的生命周期方法调用顺序如下:
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if(self) {
NSLog(@"-----%s",__func__);
}
return self;
}
- (void)removeFromSuperview {
NSLog(@"-----%s",__func__);
}
- (void)willMoveToSuperview:(UIView *)newSuperview {
NSLog(@"--------%s",__func__);
}
- (void)didMoveToSuperview {
NSLog(@"--------%s",__func__);
}
- (void)willMoveToWindow:(UIWindow *)newWindow {
NSLog(@"--------%s",__func__);
}
- (void)didMoveToWindow {
NSLog(@"--------%s",__func__);
}
- (void)willRemoveSubview:(UIView *)subview {
NSLog(@"--------%s",__func__);
}
- (void)didAddSubview:(UIView *)subview {
NSLog(@"--------%s",__func__);
}
- (void)layoutSubviews {
NSLog(@"--------%s",__func__);
}
当视图被添加到父控件上时,相关的生命周期方法调用如下:
---------[CustomView initWithFrame:]
---------[CustomView willMoveToSuperview:]
---------[CustomView didMoveToSuperview]
---------[CustomView willMoveToWindow:]
---------[CustomView didMoveToWindow]
---------[CustomView layoutSubviews]
---------[CustomView layoutSubviews]
结论:initWithFrame -->willMoveToSuperView: -->didMoveToSuperView-->willMoveToWindow:-->didMoveToWindow --->layoutSubviews
当视图从父视图移除后,调用的输入如下:
单纯将视图从父视图上移除,只会触发UIView的removeFromSuperView函数。不会触发其他的生命周期函数。
输出如下:
---------[CustomView willMoveToWindow:]
---------[CustomView didMoveToWindow]
---------[CustomView removeFromSuperview]
当view 所在的控制器pop或者dismiss掉时,会触发willMoveToWindow:,此时参数为nil。
这里两个函数:willRemoveSubview:、didAddSubview:这两个函数只有在subview添加或者从控件上移除时,才会触发。参数分别对应移除或者添加的subview。
以上方法需要我们在UIView的子类中去重写,不需要强制调用super,不同于UIViewController中生命周期的函数。当然如果父类不是UIView,而是一个自定义View类,是否需要调用super,需要根据具体业务场景来决定。
2、其他UIView中的方法:
UIView还有很多方法,例如:
bringSubViewToFront:将指定的view移动到subviews 数组的末端,也就是最上层来展示。
sendSubviewToBack:同上面相反,将view移动到subviews数组的第一个位置,也就是视图最底层。
等等。
这里不再展开说,有兴趣大家可以自行去研究。