语境
我正在使用这个简单的库为我的应用程序(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之外显示(请参见下文)。
我立即注意到的一件事是,各层没有以相同的方式放错位置-一层位于其视图上方,另一层位于左侧。我假设这与视图的约束有关,但是我无法弄清楚如何解决它。
同样令我感到困惑的是,当在iPhone 5模拟器上运行时,这些图层的外观完全符合我的期望(请参见下文)。
我觉得我误解了这里工作中的一些概念。如何获得相同的定位?(类似于iPhone5 gif。)
或者,是否有更好的方法来做我想做的事情?
viewDidLoad
还为时过早。记住,viewDidLoad
还早。该视图尚未出现在界面中,没有任何东西具有其最终的大小/位置。如果要将图层添加到view
小视图而不是作为小视图的子图层,则必须在以后运行图层创建代码,以便正确定位。viewDidAppear:
或viewDidLayoutSubviews
将是安全的-但当然您必须使用bool标志,这样您才可以进行多次操作。
我个人不知道为什么您不将图层添加到小视图中。因此,您只需要设置pulse.frame = v.bounds
一个子层并将其添加到v
,而不是添加到您的view
。它解决了定位问题并获得了正确的关系。这样做是viewDidLoad
可行的,因为当视图移动时,图层将随之移动。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句