【问题标题】:Preventing CALayer Sublayers From Getting Scaled防止 CALayer 子层被缩放
【发布时间】:2011-03-30 20:05:55
【问题描述】:

我在图层托管视图中有一些 CALayers。这些层中的每一个都有额外的层来容纳(1)一个关闭按钮,和(2)一个调整大小的手柄。这些额外的“控制”层作为子层添加到父层。

目前,当我缩放这些图层所在的工作空间时,所有内容都会缩放——包括这些控制图层。但是,我想阻止这些控制层缩放。

有没有一种方法可以覆盖将比例变换应用于所有子层的行为,而不必覆盖每个控制层的 drawInContext: 方法(大概是为了反转任何现有的比例变换——假设这是可能的)并且没有每次缩放都必须手动向每个控制层发送 setNeedsDisplay: 吗?

我发现这个帖子讨论了做类似的事情,但讨论的方向是 CATiledLayers,这不是我在这里寻找的。​​p>

Redrawing CALayer subclass when super layer is scaled

此外,这篇文章提出了一个相关的问题,但回答不适用于我的情况,因为我无法覆盖控件——它们必须是层层次结构的一部分。

How do I keep a CALayer, sublayer of a CATiledLayer, from changing it's scale after a zoom?

【问题讨论】:

  • 我最终通过覆盖自定义 CALayers 的 layoutSublayers 方法解决了这个问题,获取层层次结构的累积缩放变换,并将逆变换应用于控制子层。

标签: objective-c cocoa zooming calayer scale


【解决方案1】:

我最终解决了这个问题,方法是覆盖我的自定义 CALayers 的 layoutSublayers 方法,获取层层次结构的累积缩放变换,并将逆变换应用于控制子层。

【讨论】:

  • 您是否在视图控制器的scrollViewDidZoom: 委托方法中为受影响的视图调用了[layer setNeedsLayout]
  • 是的,也不是。该应用程序使用的是 AppKit 而不是 UIKit。因此 UIScrollView 和 UIScrollViewDelegate 不可用。但是,如果您使用的是 UIKit,那么您建议的方式就是一种方法。在这个应用程序中,一个单层托管视图承载一个内容层,该层又包含许多子层。缩放/缩放变换直接应用于内容层,然后将setNeedsLayout 发送到内容层内的所有项目层,以便子层控件可以设置其逆变换以保持固定大小。
猜你喜欢
  • 2019-09-01
  • 2012-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-01
  • 2011-05-05
  • 1970-01-01
相关资源
最近更新 更多