layoutsubViews

作者: LeeDev | 来源:发表于2016-09-22 18:04 被阅读369次

    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];
    }
    

    相关文章

      网友评论

      • dkStart:“只是马上触发layoutSubViews的方法,如果单单的调用它是不会触发layoutSubViews”,这句我看的是一脸蒙蔽啊
        LeeDev:@dkStart 是这个意思: 调用 setNeedLayout 不会马上去执行layoutSubViews里面的方法,而是要等到 下一个runloop 才执行,只有调用了layoutIfNeed 才会马上去执行layoutSubViews里面的方法
      • Crowdasola:倒数第二个例子,连续调用三次setNeedsLayout之后只调用一次layoutSubViews,是什么原理,是因为多次调用只执行一次吗,并且是延迟执行?
        Crowdasola:@李重阳_arc 调用三次只执行一次,是因为你最开始举的例子吧,既addSubview又调整frame,但是只执行一次layoutSubviews
        LeeDev:@IT狂人Bill 不是呀,是 setNeed 不会立即执行,layoutifneed马上执行

      本文标题:layoutsubViews

      本文链接:https://www.haomeiwen.com/subject/lsizettx.html