层的 UIView 的子层在 Storyboard 中显示为 @IBDesignable,但在模拟器中却没有
Posted
技术标签:
【中文标题】层的 UIView 的子层在 Storyboard 中显示为 @IBDesignable,但在模拟器中却没有【英文标题】:Sublayer of a layer's UIView showing fine in Storyboard as @IBDesignable, but not in the simulator 【发布时间】:2014-09-13 09:51:10 【问题描述】:我的 UIView 带有一个附加到 UIView 层的子层。 UIView 具有@IBDesignable-tag 并完美地显示在情节提要中。
但是,如果我在模拟器中启动应用程序,子层不会显示。我没有收到任何错误消息,只是没有显示子层。
有没有人知道我该如何调试这个问题或关于原因的任何其他想法?我尝试使用调试器工具栏中的新“Debug View Hierarchy”按钮对其进行调试,但不幸的是它只显示视图而不显示图层!
这是我的配置:
Xcode 6 黄金大师 UIView 代码在 Swift 中 ios 8您可以在 Dropbox 中找到 Xcode 项目: https://www.dropbox.com/s/uejq7j74qyx715x/ArcProblem.zip?dl=0
导致问题的视图称为“RotateMeterView.swift”
【问题讨论】:
我遇到了完全相同的问题。你找到解决办法了吗? 【参考方案1】:问题终于解决了:我用苹果开了一个TSI。结果出来了,这是我的一个编程错误。请在此处找到 Apple 提供的答案:
您不应该使用视图框架来计算子视图的位置。事实上,您永远不应该从视图本身访问视图的框架。相反,使用 bounds 属性返回当前视图坐标空间中的值。请参阅View Programming Guide for iOS 了解更多信息。
所以这一行:
circleLayer.position = CGPoint(x:CGRectGetMidX(frame), y:frame.origin.y + frame.height - radius - dy)
应该变成:
circleLayer.position = CGPoint(x:CGRectGetMidX(bounds), y:bounds.origin.y + bounds.height - radius - dy)
此外,您不应在仅在视图加载时调用一次的函数中定位和调整子视图。视图大小在加载后可以并且确实会发生变化(例如,在旋转期间)。您的视图应该覆盖 -layoutSubviews
并将 circleLayer 定位在那里。
【讨论】:
您所说的关于覆盖-layoutSubviews
并将 CALayer 定位在那里的内容在经过数小时的搜索后救了我。非常感谢!
这里也一样。祝你永生以上是关于层的 UIView 的子层在 Storyboard 中显示为 @IBDesignable,但在模拟器中却没有的主要内容,如果未能解决你的问题,请参考以下文章