升级到Xcode 8后,viewDidLayoutSubviews中的UIView框架出现错误

14

在每个xib文件中,它都会询问我要使用哪个默认设备。我选择了iPhone 6并更新了建议的框架。现在,在viewWill或viewDidLayoutSubviews中受到影响的任何视图都变得混乱了。它们的框架都是CGRect(0,0,1000,1000)

这是我的代码:

self.headImage.layer.cornerRadius = ceilf(CGRectGetWidth(self.headImage.frame)/2);
self.headImage.layer.masksToBounds = YES;

不知道这是怎么回事,还有是否有解决方法。谢谢。


你能展示一下你的代码吗? - Aaron Brager
self.headImage.layer.cornerRadius = ceilf(CGRectGetWidth(self.headImage.frame)/2); self.headImage.layer.masksToBounds = YES; // 但是这个frame是错误的;在xib中它的高度和宽度应该是62和62; - PiscesZjc
1
在更新Xcode 8之后,我遇到了完全相同的问题。然���,在viewDidLayoutSubviews上的第二个触发器会给出正确的框架。 - Murat Tezyapar
1
我也遇到了与Xcode 8.0相同的问题。 - India
在获取myOwniew的frame之前,我通过调用myOwniew.layoutIfNeeded()解决了我的问题。 - India
3个回答

25

我通过打电话解决了我的问题。

myOwnView.layoutIfNeeded() 

在获取myOwnView.frame之前


4
这个方法可行,但我不确定为什么需要这样做。我认为布局过程会在didLayoutSubviews回调之前完成。 - Legoless
3
这对我也有用,但我认为viewDidLayoutSubviews()的整个观点是视图已经被布局好了,难道不是吗? - Samuel Noyes
似乎基于约束的视图仍在调用didLayoutSubviews()时进行布局。有关更多信息,请参见https://dev59.com/cYjca4cB1Zd3GeqPqQL3#28622285。 - adamjansch
这里也有同样的问题。即使已经调用了didLayoutSubviews,子视图的.frame仍为{zero, zero}。我通过强制执行布局传递(setNeedsLayout()和layoutIfNeeded())来解决了这个问题。多么糟糕的API啊。 - Womble
这对我也起作用,通过在layoutSubviews()之前调用它而不是在布局覆盖中调用它。我随后使用它来获取具有动态内容的UIScrollView的大小。是啊 - wtf,苹果? - RowanPD

5
如果即使在调用viewDidLayoutSubviews后您仍然得到错误的框架,请在layoutSubviews上调用layoutIfNeeded就可以解决问题!
override func layoutSubviews() {
    super.layoutSubviews()

    yourView.layoutIfNeeded()
    setGradientForYourView()

}


1
帮助我根据UIScrollView的更新框架设置contentSize。谢谢! - Haim

0

当我从推送的ViewController返回并且在ViewDidLayoutSubviews中时,出现了这个问题,框架不正确。

我的视图的宽度约束被设置为与父视图的宽度成比例,并且没有常量偏移量。我用偏移约束替换了这个比例约束,现在框架被正确计算。

这个问题出现在XCode 10,iOS 12,iPhone 6 Plus上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接