CALayer未在View中正确定位

时间:2015-02-12 00:45:49

标签: ios swift uiview autolayout calayer

上下文

我正在使用this simple library为我的应用程序(TL; DR,水平分页视图控制器)进行介绍/演练。我目前有3页设置。

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

viewDidLoad(对于第3页)我创建了圆形图层,并将其框架设置为与我定位的视图相同,假设圆圈与视图位于同一位置:

    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一样。)

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

1 个答案:

答案 0 :(得分:8)

viewDidLoad太早了。请记住,viewDidLoad是早期的;视图还没有在界面中,没有任何东西有其最终的大小/位置。如果您要将图层添加到view而不是作为小视图的子图层,则必须稍后运行图层创建代码,以便获得正确的位置。 viewDidAppear:viewDidLayoutSubviews将是安全的 - 但当然你必须使用bool标志,这样你就不会做太多次了。

就我个人而言,我不知道你为什么不在小视图中添加图层。因此,您只需设置pulse.frame = v.bounds并将其添加为v的子图层,而不是view。它解决了定位并获得了正确的关系。在viewDidLoad中执行此操作会起作用,因为当视图移动时,图层会随之移动。