从Xcode8和IOS10开始,viewDidLayoutSubviews自动缩放窗口好像总是不对了?

0 投票
最新提问 3月 2 分类:IOS | 用户: 小肥羊 (120 分)

貌似在响应Xcode 8的viewDidLoad时,所有视图控制的子视图大小都是1000*1000,很奇怪,不过viewDidLayoutSubviews 确实是这样。
在我的工程里,我想打印一个按钮的尺寸,代码如下

(void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];

    NSLog(@"%@", self.myButton);
}

输出显示的是1000*1000的按钮!而我如果打印点击时的按钮尺寸,又会显示正常的尺寸。我用的是自动缩放属性(autolayout).这是个bug吗?

1个回答

0 投票
最新回答 3月 12 用户: 西门吹雪 (220 分)
现在,Interface Builder允许用户动态更改storyboard中每个视图控制器的大小,以模拟某个特定设备。
在此功能之前,用户应手动设置每个视图控制器大小。所以视图控制器以一定的大小保存,可以在initWithCoder中用于设置初始帧。
现在,似乎initWithCoder不使用在storyboard中定义的大小,并为viewcontroller视图及其所有子视图定义一个1000x1000 px大小。
这不是问题,因为视图总要选用这些布局中的一种来配置:
autolayout,自动布局,所有的参数自动匹配视图
autoresizingMask,自动调整子控件与父控件中间的位置

但是与视图图层相关的所有布局都存在一个问题,例如cornerRadius,因为autolayout和自动调整都不适用于图层属性。
解决这个问题的常见方法是使用viewDidLayoutSubviews(在视图控制器中),或layoutSubview(在视图中)。在这一点(不要忘了调用他们的超级相对方法),你很确定所有的布局东西已经完成!
不过在某些情况下,视图仍然会变成1000x1000大小。例如:
在UITableViewCell&UICollectionViewCell的子类中,layoutSubview在子视图正确布局后不会被调用。

好,剩下的大家补充吧:)
欢迎来到编程助手,编程方面有什么不懂的问题可以尽管在这里提问,你将会收到热心爱好者的回答。
...