前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >UIView - 生命周期

UIView - 生命周期

作者头像
大壮
发布2019-02-22 09:50:24
2.8K0
发布2019-02-22 09:50:24
举报
文章被收录于专栏:大壮

一般情况都是说UIViewController的生命周期,UIView的生命周期经常被忽视。

1.没有子控件的UIView

显示过程:

代码语言:javascript
复制
//(superview)
- (void)willmovetosuperview:(nullable UIView *)newSuperview
- (void)didmovetosuperview

//(window)
- (void)willmovetowindow:(nullable UIWindow *)newWindow
- (void)didmovetowindow

- (void)layoutsubviews

移出过程:

代码语言:javascript
复制
//(window)
- (void)willmovetowindow:(nullable UIWindow *)newWindow
- (void)didmovetowindow

//(superview)
- (void)willmovetosuperview:(nullable UIView *)newSuperview
- (void)didmovetosuperview

- (void)removeFromSuperview
- (void)dealloc

但是在移出时newWindow和newSuperview 都是nil。

2.包含子控件的UIView

当增加一个子控件时,就会执行 didaddsuperrview,之后也会执行一次layoutsubview。 在view释放后,执行完,dealloc就会多次执行willremovsubview.先add的view,先释放掉。

3.layoutsubview

在上面的方法中,经常发现layoutsubview会被调用,下面说下layoutsubview的调用情况: 1、addSubview会触发layoutSubviews,如果addSubview 如果连续2个 只会执行一次,具体原因下面说。 2、设置view的Frame会触发layoutSubviews,必须是frame的值设置前后发生了变化。 3、滚动一个UIScrollView会触发layoutSubviews。 4、旋转Screen会触发父UIView上的layoutSubviews事件。 5、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件。

***TIP

  1. 如果要立即执行layoutsubview, 要先调用[view setNeedsLayout],把标记设为需要布局. 然后马上调用[view layoutIfNeeded],实现布局.

其中的原理是:执行setNeedsLayout后会在receiver标上一个需要被重新布局的标记,在系统runloop的下一个周期自动调用layoutSubviews。 这样刷新会产生延迟,所以我们需要马上执行layoutIfNeeded。就会开始遍历subviews的链,判断该receiver是否需要layout。如果需要立即执行layoutsubview

  1. addSubview

每一个视图只能有唯一的一个父视图。如果当前操作视图已经有另外的一个父视图,则addsubview的操作会把它先从上一个父视图中移除(包括响应者链),再加到新的父视图上面。

并且连续2次的addSubview,只会执行一次layoutsubview。因为一次的runLoop结束后,如果有需要刷新,执行一次即可。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.01.15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.没有子控件的UIView
  • 2.包含子控件的UIView
  • 3.layoutsubview
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档