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 Class
。 All
在那里不是更有意义吗?
将其更改为全部,无效。顺便说一下,这个尺寸等级是默认值。我也可能找到另一种方法来做到这一点,但我真的很好奇为什么这不起作用,而且无论如何它应该
【参考方案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 会干扰动画?