启用了autolayout会调用几次layoutSubviews?

zioc2014 2015-03-04 11:03:13
写的demo会调用两次layoutSubview,为什么呢?


#import "CustomView.h"

@implementation CustomView

- (void)layoutSubviews {
[super layoutSubviews];

NSLog(@"frame:%@",NSStringFromCGRect(self.frame));
}

@end
...全文
788 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zioc2014 2015-03-04
  • 打赏
  • 举报
回复
引用 1 楼 zhangao0086 的回复:
addSubview一次,setFrame一次
没subview setFrame应该是autolayout调用的吧?
Bannings 2015-03-04
  • 打赏
  • 举报
回复
addSubview一次,setFrame一次
Bannings 2015-03-04
  • 打赏
  • 举报
回复
引用 8 楼 zioc2014 的回复:
[quote=引用 7 楼 zhangao0086 的回复:] [quote=引用 6 楼 zioc2014 的回复:] [quote=引用 5 楼 zhangao0086 的回复:] [quote=引用 4 楼 zioc2014 的回复:] [quote=引用 3 楼 zhangao0086 的回复:] [quote=引用 2 楼 zioc2014 的回复:] [quote=引用 1 楼 zhangao0086 的回复:] addSubview一次,setFrame一次
没subview setFrame应该是autolayout调用的吧?[/quote] 第一次是自己被添加到视图层级上的时候; 第二次应该是自己的frame被更新了[/quote] 看代码 两次的log一样,按理说没更新[/quote] 那就看它的父视图是什么被添加到视图层级上的,layoutSubviews方法被调用的时候,自己的子视图的该方法也会被调用[/quote] 先谢啦。 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被调用了一次,还有一次呢? [/quote] 你上面说的对,我也在11年的时候转载过,原文:http://blog.logichigh.com/2011/03/16/when-does-layoutsubviews-get-called/。 但是似乎从xib(或storyboard)中启动的话略有不同,我也没有找到具体的xib加载过程[/quote] 我有看你以前写的DKCarouselView 里面是这样避免layoutsubview多次执行的:)

if (CGRectEqualToRect(self.lstRect, self.frame)) return;
[/quote] 是的,因为UIScrollView在滚动中是实时调用layoutSubviews方法的,但是我又需要在scrollView的frame发生变化的时候即时更新子视图,所以就采用了这种做法
zioc2014 2015-03-04
  • 打赏
  • 举报
回复
引用 7 楼 zhangao0086 的回复:
[quote=引用 6 楼 zioc2014 的回复:] [quote=引用 5 楼 zhangao0086 的回复:] [quote=引用 4 楼 zioc2014 的回复:] [quote=引用 3 楼 zhangao0086 的回复:] [quote=引用 2 楼 zioc2014 的回复:] [quote=引用 1 楼 zhangao0086 的回复:] addSubview一次,setFrame一次
没subview setFrame应该是autolayout调用的吧?[/quote] 第一次是自己被添加到视图层级上的时候; 第二次应该是自己的frame被更新了[/quote] 看代码 两次的log一样,按理说没更新[/quote] 那就看它的父视图是什么被添加到视图层级上的,layoutSubviews方法被调用的时候,自己的子视图的该方法也会被调用[/quote] 先谢啦。 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被调用了一次,还有一次呢? [/quote] 你上面说的对,我也在11年的时候转载过,原文:http://blog.logichigh.com/2011/03/16/when-does-layoutsubviews-get-called/。 但是似乎从xib(或storyboard)中启动的话略有不同,我也没有找到具体的xib加载过程[/quote] 我有看你以前写的DKCarouselView 里面是这样避免layoutsubview多次执行的:)

if (CGRectEqualToRect(self.lstRect, self.frame)) return;
Bannings 2015-03-04
  • 打赏
  • 举报
回复
引用 6 楼 zioc2014 的回复:
[quote=引用 5 楼 zhangao0086 的回复:] [quote=引用 4 楼 zioc2014 的回复:] [quote=引用 3 楼 zhangao0086 的回复:] [quote=引用 2 楼 zioc2014 的回复:] [quote=引用 1 楼 zhangao0086 的回复:] addSubview一次,setFrame一次
没subview setFrame应该是autolayout调用的吧?[/quote] 第一次是自己被添加到视图层级上的时候; 第二次应该是自己的frame被更新了[/quote] 看代码 两次的log一样,按理说没更新[/quote] 那就看它的父视图是什么被添加到视图层级上的,layoutSubviews方法被调用的时候,自己的子视图的该方法也会被调用[/quote] 先谢啦。 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被调用了一次,还有一次呢? [/quote] 你上面说的对,我也在11年的时候转载过,原文:http://blog.logichigh.com/2011/03/16/when-does-layoutsubviews-get-called/。 但是似乎从xib(或storyboard)中启动的话略有不同,我也没有找到具体的xib加载过程
zioc2014 2015-03-04
  • 打赏
  • 举报
回复
引用 5 楼 zhangao0086 的回复:
[quote=引用 4 楼 zioc2014 的回复:] [quote=引用 3 楼 zhangao0086 的回复:] [quote=引用 2 楼 zioc2014 的回复:] [quote=引用 1 楼 zhangao0086 的回复:] addSubview一次,setFrame一次
没subview setFrame应该是autolayout调用的吧?[/quote] 第一次是自己被添加到视图层级上的时候; 第二次应该是自己的frame被更新了[/quote] 看代码 两次的log一样,按理说没更新[/quote] 那就看它的父视图是什么被添加到视图层级上的,layoutSubviews方法被调用的时候,自己的子视图的该方法也会被调用[/quote] 先谢啦。 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被调用了一次,还有一次呢?
Bannings 2015-03-04
  • 打赏
  • 举报
回复
引用 4 楼 zioc2014 的回复:
[quote=引用 3 楼 zhangao0086 的回复:] [quote=引用 2 楼 zioc2014 的回复:] [quote=引用 1 楼 zhangao0086 的回复:] addSubview一次,setFrame一次
没subview setFrame应该是autolayout调用的吧?[/quote] 第一次是自己被添加到视图层级上的时候; 第二次应该是自己的frame被更新了[/quote] 看代码 两次的log一样,按理说没更新[/quote] 那就看它的父视图是什么被添加到视图层级上的,layoutSubviews方法被调用的时候,自己的子视图的该方法也会被调用
zioc2014 2015-03-04
  • 打赏
  • 举报
回复
引用 3 楼 zhangao0086 的回复:
[quote=引用 2 楼 zioc2014 的回复:] [quote=引用 1 楼 zhangao0086 的回复:] addSubview一次,setFrame一次
没subview setFrame应该是autolayout调用的吧?[/quote] 第一次是自己被添加到视图层级上的时候; 第二次应该是自己的frame被更新了[/quote] 看代码 两次的log一样,按理说没更新
Bannings 2015-03-04
  • 打赏
  • 举报
回复
引用 2 楼 zioc2014 的回复:
[quote=引用 1 楼 zhangao0086 的回复:] addSubview一次,setFrame一次
没subview setFrame应该是autolayout调用的吧?[/quote] 第一次是自己被添加到视图层级上的时候; 第二次应该是自己的frame被更新了

29,030

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧