CALayer 子层在设备旋转期间不优雅

Posted

技术标签:

【中文标题】CALayer 子层在设备旋转期间不优雅【英文标题】:CALayer sublayer not graceful during device rotation 【发布时间】:2017-12-20 08:43:29 【问题描述】:

我直接在视图层上画了一个圆圈,设备旋转看起来很完美。

绘图发生在func draw(_ rect: CGRect) 方法中。

然后我在一个子层上画了一个圆圈,并在 init 方法中将它添加到视图中。

我在func draw(_ rect: CGRect) 方法中更新了子层的框架。

在我看来,有时子层会在设备旋转完成之前更新。 因此下面的第一张图片。

让这个看起来更好一点的快速修复是剪辑子视图层。 这样圆圈就不会流血到主视图(橙色视图)。

虽然这不能解决主要问题。 我不知道为什么添加子层会导致此问题。

我也在超级视图的draw方法中绘制子层的内容。橙色视图不是超级视图,超级视图是中间的矩形

轮换期间

注意:我没有添加示例代码,因为我看到的所有示例都有相同的问题。 其他人通过硬编码视图的大小来解决这个问题,因此旋转不会调整视图的大小,旋转也不会导致这种情况。 他们还倾向于将视图锁定为纵向模式。

不过,如果需要示例代码,我可以创建一个简单的示例。

【问题讨论】:

你试过在layoutSubview方法中画你的图层吗? 你能提供一个简单的例子吗? @3366784 我找到了一篇很棒的文章,里面有示例代码,看看我的回答。 【参考方案1】:

我找到了解决问题的方法。

在我看来,其他所有人都有同样的问题。 这是因为图层没有约束。

我们在生产应用中看不到这些问题,因为应用通常被锁定为纵向模式。 苹果似乎也倾向于使用图像作为控件并避免绘图。 这是根据我读到的 Ray Wenderlich article 的说法。


解决方案基本上是使用子视图(而不是子图层),并使用子视图内置的图层进行绘制。

本文讲解流程:https://marcosantadev.com/calayer-auto-layout-swift/

这是一张显示带有子视图和子图层的旋转的图像。 子视图优雅地旋转,因为它有约束。

【讨论】:

以上是关于CALayer 子层在设备旋转期间不优雅的主要内容,如果未能解决你的问题,请参考以下文章

立即更新 CALayer 子层

为啥动画自定义 CALayer 属性会导致其他属性在动画期间为零?

如何保持 CALayer(CATiledLayer 的子层)在缩放后不改变其比例?

如何在缩放的 CALayer 中保持子层的比例

移动层上的 iOS CALayer.mask

在 UIImageView 上一致地居中 CALayer 子层