viewDidLayoutSubviews 中的 UIImageView 宽度是 1000?

Posted

技术标签:

【中文标题】viewDidLayoutSubviews 中的 UIImageView 宽度是 1000?【英文标题】:UIImageView width in viewDidLayoutSubviews is 1000? 【发布时间】:2016-10-16 17:25:12 【问题描述】:

我有一个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。更奇怪的是,如果我在最后两行注释,UIImageView 将可见,因此约束设置正确。

我不知道为什么会这样。

编辑

故事板屏幕截图:

【问题讨论】:

显示更多信息,视图的约束/层次结构等。 继承UIImageView 并使用layoutSubviews 要容易得多。此外,您只需更改情节提要中的类,就不需要更多代码了。 您确定您正在使用正确的尺寸等级运行您的应用程序吗?我看到您在视图中标记了This Size ClassAll 在那里不是更有意义吗? 将其更改为全部,无效。顺便说一下,这个尺寸等级是默认值。我也可能找到另一种方法来做到这一点,但我真的很好奇为什么这不起作用,而且无论如何它应该 【参考方案1】:

同样的事情也发生在我身上。有一个 UIImageView 正在转换为一个圈子帖子 awakeFromNib 通过:

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

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

在包含我的图像视图的.xib 完全没有任何更改的情况下,角半径修改工作正常。但是,当我在 XCode 8 中打开这个 .xib 文件(不做任何更改)时,图像视图圈修改不再起作用。这是因为,正如您所注意到的,图像视图的宽度被检测为 1000,而不是我设置为 (32) 的恒定宽度约束。

您可能知道 xcode 几乎每次打开一个条目时都会更改 .xib 条目,即使没有执行任何修改。其中很多是微不足道的 IDE 版本标签,但有时随着主要 IDE 版本之间的更改,它们会出于“兼容性”目的而更改 .xib 的重要属性。


解决方法:直到 Apple 修复此问题...

    打开您的 .xib 文件并执行您需要的任何更改。 打开 Xcode 右侧的文件检查器选项卡 在Interface Builder Document部分下,选择“Opens in Xcode 7.x” 这将提示您保存并关闭.xib。这样做并且在每次更改后如果不执行这些步骤就不要再次打开文件 再次运行您的应用程序。 1000 宽度和高度问题已修复!

【讨论】:

【参考方案2】:

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

【讨论】:

问题是我没有改变框架或边界,我只是运行应用程序,这些是故事板的约束。 super.viewDidLayoutSubviews()之后的开头添加它,试试看会发生什么。 这样做,它显示了正确的价值,但我很好奇为什么即使没有那条线它也不应该工作。所有视图在 super.viewDidLayoutSubviews() 中都应该有正确的框架 @MegaManX, layoutIfNeeded 强制接收器在需要时立即布局其子视图,显然它在您的情况下是需要的,因为您为您的layer 添加和更新了layer。跨度> 你还是不好奇为什么它适用于普通视图,而不适用于 uiimageview?我也在uiview上更改图层属性,它不需要layoutIfNeeded

以上是关于viewDidLayoutSubviews 中的 UIImageView 宽度是 1000?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 8 的 viewDidLayoutSubviews 无限循环

什么会触发 viewDidLayoutSubviews 并寻找一个好的模式来启动子视图框架

Swift:viewDidLayoutSubviews 是啥意思?

为啥 viewDidLayoutSubviews 会干扰动画?

等效于 UITableViewCell 的 viewDidLayoutSubviews

需要有关 viewDidLayoutSubviews 的帮助