层的 UIView 的子层在 Storyboard 中显示为 @IBDesignable,但在模拟器中则不然

use*_*189 2 calayer uiview ios8

我有 UIView 与附加到 UIView 层的子层。UIView 具有 @IBDesignable 标签,并在故事板中完美显示。

但是,如果我在模拟器中启动应用程序,子层不会显示。我没有收到任何错误消息,子层只是不显示。

有谁知道我如何调试这个问题或关于原因的任何其他想法?我尝试使用调试器工具栏中的新“调试视图层次结构”按钮对其进行调试,但不幸的是它仅显示视图而不显示层!

这是我的配置:

  • Xcode 6 黄金大师
  • UIView 代码是用 Swift 编写的
  • iOS 8

在 dropbox 中,您可以找到 Xcode 项目: https://www.dropbox.com/s/uejq7j74qyx715x/ArcProblem.zip ?dl=0

导致问题的视图称为“RotateMeterView.swift”

use*_*189 5

问题终于解决了:我用苹果开了一个TSI。结果发现,这是我的一个编程错误。请在这里找到Apple提供的答案:

您不应该使用视图框架来计算子视图的位置。事实上,您永远不应该从视图本身访问视图的框架。相反,使用bounds 属性返回当前视图坐标空间中的值。有关详细信息,请参阅iOS 视图编程指南。

所以这一行:

circleLayer.position = CGPoint(x:CGRectGetMidX(frame), y:frame.origin.y + frame.height - radius - dy)
Run Code Online (Sandbox Code Playgroud)

应该变成:

circleLayer.position = CGPoint(x:CGRectGetMidX(bounds), y:bounds.origin.y + bounds.height - radius - dy)
Run Code Online (Sandbox Code Playgroud)

另外,您不应该在仅在视图加载时调用一次的函数中定位子视图并调整子视图的大小。视图大小在加载后(例如在旋转期间)可以并且确实会发生变化。您的视图应该覆盖-layoutSubviews并将circleLayer 放置在那里。