cam*_*dub 3 calayer uiview ios autolayout swift
上下文
我正在使用这个简单的库为我的应用程序(TL; DR,水平分页视图控制器)进行介绍/演练.我目前有3页设置.
在第3个演练页面中,我有一个自定义CALayer,在无限循环中动画一个圆圈.我想将该层添加到a 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)
}
Run Code Online (Sandbox Code Playgroud)
问题
当我在iPhone 6模拟器中运行应用程序时,CALayers会显示他们的UIViews(见下文).

我立刻注意到的一件事是,图层不会以同样的方式放错位置 - 一个位于其视图上方,另一个位于左侧.我假设这与视图的约束有关,但我无法弄清楚如何解决它.
同样让我感到困惑的是,当在iPhone 5模拟器上运行时,图层看起来与我期望的完全一样(见下文).

我觉得我误解了一些在这里工作的概念.我怎样才能使定位行为相同?(就像iPhone5的GIF一样.)
或者,有没有更好的方法来做我想做的事情?
viewDidLoad太早了.记住,viewDidLoad是早一点; 视图还没有在界面中,没有任何东西有其最终的大小/位置.如果您要将图层添加到view小视图的子图层而不是作为子视图的子图层,则必须稍后运行图层创建代码,以便获得正确的位置.viewDidAppear:或者viewDidLayoutSubviews是安全的 - 但当然你必须使用bool标志,这样你就不会做太多次了.
就个人而言,我不明白你为什么不在小视图中添加图层.所以你只需设置pulse.frame = v.bounds并添加为子图层v,而不是你的view.它解决了定位并获得了正确的关系.这样做viewDidLoad会有效,因为当视图移动时,图层会随之移动.
| 归档时间: |
|
| 查看次数: |
1223 次 |
| 最近记录: |