2015-02-12 55 views
3

语境CALayer的不视图

我使用this simple library使我的应用程序的前奏/演练内正确地定位(TL; DR,水平寻呼视图控制器)。我目前有3页设置。

在第3个演练页面中,我有一个自定义的CALayer,它在无限循环中为一个圆圈动画。我想将该图层添加到UIView以便在IB中通过我想要的方式布局(通过自动布局)。

viewDidLoad(用于第三页)创建的圆层,并设置其帧是相同的,因为我定位视图,假设圆将是在同一地点的视图:

for v:UIView in [view1!, view2!] { 
     var pulse = PulseLayer() 
     pulse.frame = v.frame 
     pulse.cornerRadius = v.frame.width/2.0 
     pulse.masksToBounds = false 
     view.layer.insertSublayer(pulse, above: v.layer) 
    } 

问题

当我在iPhone 6模拟器中运行应用程序时,CALayers在其UIViews外显示(见下文)。

CALayers misplaced

有一件事我立刻注意到的是层没有错以同样的方式 - 一个是它上面的观点,另一个是向左。我假设这与视图的约束有关,但我无法弄清楚如何解决它。

同样令我困惑的是,当在iPhone 5模拟器上运行时,图层显示与我预期的完全相同(请参阅下文)。

Layers correctly placed

我觉得我在这里工作的误解的一些概念。我怎样才能让定位表现得一样呢? (像iPhone5的gif)

或者,有没有更好的方法来做我想做的事情?

回答

5

viewDidLoad为时尚早。请记住,viewDidLoad是提前;该视图还没有在界面中,没有任何其最终的大小/位置。如果您要将图层添加到view而不是小视图的子图层,则必须稍后才能运行图层创建代码,以获得正确的位置。 viewDidAppear:viewDidLayoutSubviews将是安全的 - 但当然,您必须使用bool标志,因此您不要多次执行此操作。

就我个人而言,我不明白为什么不将图层添加到小视图中。因此,您只需设置pulse.frame = v.bounds并将其添加为v而不是您的view。它解决了定位问题并获得了正确的关系。在viewDidLoad中这样做会有效,因为当视图移动时,图层会随着它们一起移动。