CALayer 在视图中未正确定位

Posted

技术标签:

【中文标题】CALayer 在视图中未正确定位【英文标题】:CALayer is not positioned correctly within the View 【发布时间】:2015-02-12 00:45:48 【问题描述】:

上下文

我正在使用this simple library 为我的应用程序(TL;DR,水平分页视图控制器)进行介绍/演练。我目前有 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 之外(见下文)。

我立即注意到的一件事是图层并没有以相同的方式放错位置 - 一个在其视图上方,另一个在左侧。我假设这与视图的约束有关,但我不知道如何解决它。

让我同样困惑的是,当在 iPhone 5 模拟器上运行时,这些层的显示与我预期的完全一样(见下文)。

我觉得我误解了这里的一些概念。我怎样才能让定位发挥同样的作用? (就像 iPhone5 的 gif。)

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

以上是关于CALayer 在视图中未正确定位的主要内容,如果未能解决你的问题,请参考以下文章

无法让 CALayer 在 UIView 中显示

修复 UIScrollView 顶部和底部的 CALayer

CALayer 详解

缩放CALayer会使视图模糊

CALayer 在视图可见后添加时不渲染

CALayer 和视图消失了