神刀安全网

layoutsubViews

eg: 自定义 一个 testView ,以及一个 subView(testView 的子视图 ) 大概有下面 3个情况会触发layoutSubViews

  1. Frame的改变 会触发 ,包括 testView的 frame 改变(特别的如果初始化的Frame是 zero 会不会触发的 ),或者 subView的frame的改变 ,都会触发 testView 中的 layoutSubViews。

2.通过 addsubView 来触发,比如 [testView addsubView:subView],也是会调用layoutSubViews

3.滚动一个UIScrollView会触发layoutSubviews

通过以上3点 ,基本上大概了解了 layoutsubViews的触发机制,但是我可以肯定的,如果 同时修改 父视图testView的 frame ,并且执行 [testView addsubView:subView], 会调用 两次 layoutSubViews?

答案是否定的,只调用一次,这里我猜想,想修改上面的条件基本上是系统内部执行了 [view setNeedsLayout] 没有马上刷新

[view setNeedsLayout] 不立即触发layoutSubViews,只是标记将要刷新,在系统runloop的下一个周期自动调用layoutSubViews, 但是执行 layoutIfNeeded(只是马上触发layoutSubViews的方法,如果单单的调用它是不会触发layoutSubViews) 后会马上触发layoutSubViews

会触发 触发layoutSubViews 1次 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {      [super touchesBegan:touches withEvent:event];      [self setNeedsLayout];     [self setNeedsLayout];     [self setNeedsLayout];  //    [self layoutIfNeeded]; //    [self layoutIfNeeded]; //    [self layoutIfNeeded]; }
会触发 触发layoutSubViews 3次 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {      [super touchesBegan:touches withEvent:event];      [self setNeedsLayout];     [self layoutIfNeeded];      [self setNeedsLayout];     [self layoutIfNeeded];       [self setNeedsLayout];     [self layoutIfNeeded]; }

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » layoutsubViews

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址