ios - CALayer 未在 View 中正确定位

标签 ios swift uiview autolayout calayer

上下文

我正在使用 this simple library为我的应用程序做一个介绍/演练(TL;DR,水平分页 View Controller )。我目前有 3 个页面设置。

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

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

    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 显示在它们的 UIView 之外(见下文)。

CALayers misplaced

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

同样让我感到困惑的是,当在 iPhone 5 模拟器上运行时,图层的显示完全符合我的预期(见下文)。

Layers correctly placed

我觉得我误解了这里的一些概念。我怎样才能让定位表现得一样? (就像 iPhone5 的动图。)

或者,是否有更好的方法来完成我想做的事情?

最佳答案

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

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

关于ios - CALayer 未在 View 中正确定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28467365/

相关文章:

ios - UIView 与容器 View

ios - 通过 Objective-C 代码解析 XML

ios - 将 UIView 单元格组件的背景颜色更改为绿色不会将组件呈现为绿色,

ios - 如何设置 UIButton 背景颜色 forState : UIControlState. 在 Swift 中突出显示

ios - 如何在 iOS 中将相机 View 方向锁定为横向?

ios - 第二次加载 UIView 后 NSConstraints 使应用程序崩溃

ios - 如何获取没有多对多关系的实体

ios - 从 Objective-C 访问 Swift 扩展

ios - 解包核心数据中的可选值时发现 nil

ios - 无法在 XIB 中添加子类