CALayer 未在视图中正确定位
CALayer is not positioned correctly within the View
上下文
我正在使用 this simple library 为我的应用程序制作 intro/walkthrough(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 模拟器中 运行 应用程序时,CALayer 显示在它们的 UIView 之外(见下文)。
我立即注意到的一件事是图层没有以相同的方式错放——一个在其视图上方,另一个在左侧。我假设这与视图的限制有关,但我不知道如何解决它。
同样让我感到困惑的是,当 运行 在 iPhone 5 模拟器上时,图层的显示完全符合我的预期(见下文)。
我觉得我误解了这里的一些概念。我怎样才能让定位表现得一样? (喜欢 iPhone5 gif。)
或者,是否有更好的方法来完成我想做的事情?
viewDidLoad
太快了。请记住,viewDidLoad
太早了;视图还不在界面中,没有什么是最终的 size/position。如果您要将图层添加到 view
而不是作为小视图的子图层,则您必须稍后 运行 图层创建代码,以便获得正确的位置。 viewDidAppear:
或 viewDidLayoutSubviews
是安全的 - 但当然你必须使用 bool 标志,这样你就不会做太多次。
就我个人而言,我不明白您为什么不将图层添加到小视图中。因此,您只需设置 pulse.frame = v.bounds
并将其作为子图层添加到 v
,而不是您的 view
。它解决了定位并使关系正确。在 viewDidLoad
中执行此操作会奏效,因为当视图移动时,图层也会随之移动。
上下文
我正在使用 this simple library 为我的应用程序制作 intro/walkthrough(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 模拟器中 运行 应用程序时,CALayer 显示在它们的 UIView 之外(见下文)。
我立即注意到的一件事是图层没有以相同的方式错放——一个在其视图上方,另一个在左侧。我假设这与视图的限制有关,但我不知道如何解决它。
同样让我感到困惑的是,当 运行 在 iPhone 5 模拟器上时,图层的显示完全符合我的预期(见下文)。
我觉得我误解了这里的一些概念。我怎样才能让定位表现得一样? (喜欢 iPhone5 gif。)
或者,是否有更好的方法来完成我想做的事情?
viewDidLoad
太快了。请记住,viewDidLoad
太早了;视图还不在界面中,没有什么是最终的 size/position。如果您要将图层添加到 view
而不是作为小视图的子图层,则您必须稍后 运行 图层创建代码,以便获得正确的位置。 viewDidAppear:
或 viewDidLayoutSubviews
是安全的 - 但当然你必须使用 bool 标志,这样你就不会做太多次。
就我个人而言,我不明白您为什么不将图层添加到小视图中。因此,您只需设置 pulse.frame = v.bounds
并将其作为子图层添加到 v
,而不是您的 view
。它解决了定位并使关系正确。在 viewDidLoad
中执行此操作会奏效,因为当视图移动时,图层也会随之移动。