写的demo会调用两次layoutSubview,为什么呢?
#import "CustomView.h"@implementation CustomView- (void)layoutSubviews {
    [super layoutSubviews];
    
    NSLog(@"frame:%@",NSStringFromCGRect(self.frame));
}@end

解决方案 »

  1.   

    addSubview一次,setFrame一次
      

  2.   

    没subview
    setFrame应该是autolayout调用的吧?
      

  3.   

    没subview
    setFrame应该是autolayout调用的吧?
    第一次是自己被添加到视图层级上的时候;
    第二次应该是自己的frame被更新了
      

  4.   

    没subview
    setFrame应该是autolayout调用的吧?
    第一次是自己被添加到视图层级上的时候;
    第二次应该是自己的frame被更新了
    看代码 两次的log一样,按理说没更新
      

  5.   

    没subview
    setFrame应该是autolayout调用的吧?
    第一次是自己被添加到视图层级上的时候;
    第二次应该是自己的frame被更新了
    看代码 两次的log一样,按理说没更新
    那就看它的父视图是什么被添加到视图层级上的,layoutSubviews方法被调用的时候,自己的子视图的该方法也会被调用
      

  6.   

    没subview
    setFrame应该是autolayout调用的吧?
    第一次是自己被添加到视图层级上的时候;
    第二次应该是自己的frame被更新了
    看代码 两次的log一样,按理说没更新
    那就看它的父视图是什么被添加到视图层级上的,layoutSubviews方法被调用的时候,自己的子视图的该方法也会被调用
    先谢啦。layoutSubviews在以下情况下会被调用:
    1、init初始化不会触发layoutSubviews
    2、addSubview会触发layoutSubviews
    3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化
    4、滚动一个UIScrollView会触发layoutSubviews
    5、旋转Screen会触发父UIView上的layoutSubviews事件
    6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件
    对吗?在demo中,xib的基View上面就是CustomView,再没有其他view
    情况3被调用了一次,还有一次呢?
      

  7.   

    没subview
    setFrame应该是autolayout调用的吧?
    第一次是自己被添加到视图层级上的时候;
    第二次应该是自己的frame被更新了
    看代码 两次的log一样,按理说没更新
    那就看它的父视图是什么被添加到视图层级上的,layoutSubviews方法被调用的时候,自己的子视图的该方法也会被调用
    先谢啦。layoutSubviews在以下情况下会被调用:
    1、init初始化不会触发layoutSubviews
    2、addSubview会触发layoutSubviews
    3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化
    4、滚动一个UIScrollView会触发layoutSubviews
    5、旋转Screen会触发父UIView上的layoutSubviews事件
    6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件
    对吗?在demo中,xib的基View上面就是CustomView,再没有其他view
    情况3被调用了一次,还有一次呢?
    你上面说的对,我也在11年的时候转载过,原文:http://blog.logichigh.com/2011/03/16/when-does-layoutsubviews-get-called/。
    但是似乎从xib(或storyboard)中启动的话略有不同,我也没有找到具体的xib加载过程
      

  8.   

    没subview
    setFrame应该是autolayout调用的吧?
    第一次是自己被添加到视图层级上的时候;
    第二次应该是自己的frame被更新了
    看代码 两次的log一样,按理说没更新
    那就看它的父视图是什么被添加到视图层级上的,layoutSubviews方法被调用的时候,自己的子视图的该方法也会被调用
    先谢啦。layoutSubviews在以下情况下会被调用:
    1、init初始化不会触发layoutSubviews
    2、addSubview会触发layoutSubviews
    3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化
    4、滚动一个UIScrollView会触发layoutSubviews
    5、旋转Screen会触发父UIView上的layoutSubviews事件
    6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件
    对吗?在demo中,xib的基View上面就是CustomView,再没有其他view
    情况3被调用了一次,还有一次呢?
    你上面说的对,我也在11年的时候转载过,原文:http://blog.logichigh.com/2011/03/16/when-does-layoutsubviews-get-called/。
    但是似乎从xib(或storyboard)中启动的话略有不同,我也没有找到具体的xib加载过程
    我有看你以前写的DKCarouselView
    里面是这样避免layoutsubview多次执行的:)if (CGRectEqualToRect(self.lstRect, self.frame)) return;
      

  9.   

    没subview
    setFrame应该是autolayout调用的吧?
    第一次是自己被添加到视图层级上的时候;
    第二次应该是自己的frame被更新了
    看代码 两次的log一样,按理说没更新
    那就看它的父视图是什么被添加到视图层级上的,layoutSubviews方法被调用的时候,自己的子视图的该方法也会被调用
    先谢啦。layoutSubviews在以下情况下会被调用:
    1、init初始化不会触发layoutSubviews
    2、addSubview会触发layoutSubviews
    3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化
    4、滚动一个UIScrollView会触发layoutSubviews
    5、旋转Screen会触发父UIView上的layoutSubviews事件
    6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件
    对吗?在demo中,xib的基View上面就是CustomView,再没有其他view
    情况3被调用了一次,还有一次呢?
    你上面说的对,我也在11年的时候转载过,原文:http://blog.logichigh.com/2011/03/16/when-does-layoutsubviews-get-called/。
    但是似乎从xib(或storyboard)中启动的话略有不同,我也没有找到具体的xib加载过程
    我有看你以前写的DKCarouselView
    里面是这样避免layoutsubview多次执行的:)if (CGRectEqualToRect(self.lstRect, self.frame)) return;

    是的,因为UIScrollView在滚动中是实时调用layoutSubviews方法的,但是我又需要在scrollView的frame发生变化的时候即时更新子视图,所以就采用了这种做法