层的 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,但在模拟器中却没有的主要内容,如果未能解决你的问题,请参考以下文章

添加 AVPlayerLayer 作为当前视图的子层在 iPhone 5 上不起作用

CALayer 子层在设备旋转期间不优雅

立即更新 CALayer 子层

子视图的子层与更高的子视图重叠

UIView:如何用阴影为 CALayer 框架设置动画?

如何保持 CALayer(CATiledLayer 的子层)在缩放后不改变其比例?