viewDidLayoutSubviews中的UIImageView宽度是1000?

时间:2016-10-16 17:25:13

标签: ios swift uiimageview nslayoutconstraint

我有一个UIview,它本身就有一个UIImageView。我希望两者都是四舍五入的,所以我写了这些代码行:

override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

        // make rounded profile image
        self.avatarPlaceholderView.layer.masksToBounds = true
        self.avatarPlaceholderView.layer.cornerRadius = self.avatarPlaceholderView.frame.width / 2.0
        self.avatarImageView.layer.masksToBounds = true
        self.avatarImageView.layer.cornerRadius = self.avatarImageView.frame.width / 2.0
    }

在纸面上,一切都应该正常,但事实并非如此。 UIView变为四舍五入时,UIImageView根本不会显示。进一步调查显示self.avatarPlaceholderView.frame.width返回适当的宽度,但self.avatarImageView.frame.width返回宽度1000.如果我评论最后2行,UIImageView将是可见的,那么更奇怪的是,因此约束设置正确

我不知道为什么会这样。

修改

故事板截屏:

enter image description here enter image description here

2 个答案:

答案 0 :(得分:2)

确保在更改self.avatarPlaceholderView.layoutIfNeeded()属性时运行frame/bounds,并将其布局为新的frame/bounds

答案 1 :(得分:2)

同样的事情也发生在我身上。通过以下方式将UIImageView转换为圈awakeFromNib

self.iv.layer.masksToBounds = true;
self.iv.layer.cornerRadius = self.iv.frame.width/2;

找到了根本原因,你不会喜欢它 - XCode 8 (惊喜)。

绝对没有更改包含我的imageview的.xib,角半径修改工作正常。但是,只要我在XCode 8中打开此.xib文件(不更改任何内容),图像视图圈修改就不再有效。这是因为,正如您所注意到的,图像视图的宽度被检测为1000而不是我设置为(32)的恒定宽度约束。

您可能知道xcode几乎每次打开时都会更改.xib个条目,即使没有执行任何修改也是如此。其中很多都是简单的IDE版本标签,但偶尔与主要IDE版本之间的更改一样,为了“兼容性”的目的,它们会改变.xib的非平凡属性。

Workaroud:,直到Apple修复此问题......

  1. 打开.xib文件并执行所需的任何更改。
  2. 打开Xcode右侧的文件检查器标签
  3. 界面生成器文档部分下,选择“在Xcode 7.x中打开”
  4. 这将提示您保存并关闭.xib。这样做并且不会在每次更改后执行这些步骤时再次打开文件
  5. 再次运行您的应用。 1000宽度&高度问题已修复!