将 CALayer 添加到 UIView 并能够在方向更改时重绘

Posted

技术标签:

【中文标题】将 CALayer 添加到 UIView 并能够在方向更改时重绘【英文标题】:adding CALayer to UIView with ability to redraw on orientation change 【发布时间】:2012-04-13 19:27:41 【问题描述】:

我有一个 UIView 子类,它分配给 UITableVieCell 的 backgroundView。在我的 UIView 子类中,我在 initWithFrame: 方法中添加了 2 个 CALayers。

在方向改变时,单元格的高度会改变,我需要重新调整我的 CALayers 的位置;基本上是重绘。

由于 CALayers 是在 initWithFrame: 方法中添加的,我无法通过调用 setNeedsDisplay 来重绘它们。

我是使用 CALayers 的新手,不知道这样做的正确方法是什么。如何添加我的 CALayers 以使它们在方向更改/或任何可能改变一般尺寸的事件时重绘?

【问题讨论】:

【参考方案1】:

实际上,更简单的方法是使用 KVO 来观察视图层的 bounds 属性的变化。

[self.layer addObserver:self forKeyPath:@"bounds" options:0 context:nil];

然后在您的-observeValueForKeyPath:ofObject:change:context: 方法中执行您需要的任何操作。

完成后别忘了removeObserver:self

【讨论】:

【参考方案2】:

UIView 子类中实现- (void)layoutSubviews; 方法。当视图的几何形状发生变化时,框架会调用它。您可以在那里对图层进行适当的更改。

在 CoreAnimation 中,如果您对图层进行子类化,还有一个 layoutSublayers 方法。

希望这会有所帮助。

【讨论】:

虽然我最终覆盖了drawRect: 并以完全不同的方式进行操作,但我已经尝试过您的方式并且它有效。感谢您的帮助,请记住这一点。

以上是关于将 CALayer 添加到 UIView 并能够在方向更改时重绘的主要内容,如果未能解决你的问题,请参考以下文章

将 CALayer 更改应用到 UIView

UIVIew/CALayer 动画期间的回调

使 UIView 或 CALayer 变暗的最快方法(性能方面)

CATiledLayer 到 CALayer

添加CAlayer与帧显示在错误的位置

CALayer 的 position和anchorPoint属性