我遇到了相似的问题 - 在使用自动布局与视图(用代码编写,而非 IB)时需要设置 “CALayer” 的框架。
在我的情况下,我有一个稍微复杂的层次结构,即在一个视图控制器中嵌套另一个视图控制器。我最终找到了这个 Stack Overflow 的问题,并研究了使用“viewDidLayoutSubviews”的方法。但是它没有起作用。以防您的情况类似于我自己的情况,以下是我发现的内容...
概述
我想为我正在定位为 UIViewController
中的子视图的 UIView
的 CAGradientLayer
设置框架,使用自动布局约束。
将子视图命名为 gradientView
,视图控制器命名为 child_viewController
。
child_viewController
是我设置为可重复使用组件的视图控制器。因此,“child_viewController”的“view”正在组合到父视图控制器中 - 称为 parent_viewController
。
当调用child_viewController
的viewDidLayoutSubviews
时,gradientView
的frame
尚未设置。
(在这一点上,我建议您散布一些NSLog
语句,以了解视图层次结构中视图创建的顺序等)
因此,我尝试使用viewDidAppear
。 然而,由于child_viewController
的嵌套性质,我发现viewDidAppear
没有被调用。
(请参阅此SO问题:viewWillAppear, viewDidAppear not being called, not firing)。
我的当前解决方案
我已经将viewDidAppear
添加到了parent_viewController
中,然后从那里调用child_viewController
中的viewDidAppear
。
对于初始加载, 我需要 viewDidAppear
,因为直到在 child_viewController
中调用它时,所有的子视图才有了它们的框架设置。然后我可以为 CAGradientLayer
设置框架...
我说这是我的 当前解决方案,因为我对此并不特别满意。
在最初设置 CAGradientLayer
的框架之后,如果布局发生更改(例如旋转设备),那么该框架可能会变得无效。
为了处理这个问题,我在 child_viewController
中使用 viewDidLayoutSubviews
来确保 CAGradientLayer
的框架保持在 gradientView
内。
它能工作,但感觉不太好。
(有更好的方法吗?)