2013-02-13 14 views
0

我有一个CALayer,我只为可见区域提供内容(有点类似于CATiledLayer)。问题是,在CALayer的可见区域发生变化时,似乎没有办法接收通知,以便调用displayLayer。我目前子类化并挂接setPosition,setBounds和setTransform,但是这并不能捕获超级视图/图层更改的情况(例如,UIScrollView通过更改滚动视图原点来滚动)。我将代码中的父视图和setNeedsDisplay散布在一起。CALayer的可视区域更改时的通知?

有没有更好的方法?

回答

2

当前可见的矩形是[CALayer visibleRect]。这是由滚动视图(图层)设置的,并且是您期望在滚动视图中绘制的内容。

您可能想要覆盖-needsDisplayOnBoundsChange以返回YES。这通常是你如何处理你描述的大部分内容。

如果您希望像位置这样的东西强制重绘(这很不寻常,但可行),那么您可以覆盖+needsDisplayForKey:以返回YES,以便对任何要强制重绘的关键更改进行返回。

如果您想确保只绘制需要绘制的图形,则应在绘制代码期间使用CGContextGetClipBoundingBox()检查剪裁框。

+0

感谢您的回复。 visbleRect是只读属性,所以不提供通知。 needsDisplayOnBoundsChange只捕捉到我的图层边界,而不是包含我的图层的视图/图层堆栈中的任何更改。同样,setNeedsDisplayForKey只捕获对我的图层的更改(尽管它可能是一种比覆盖方法更好的解决方案,正如我目前所做的那样)。 CGContextGetClipBoundingBox()是没用的,因为我没有CGContext。我直接使用未由CG渲染的图像设置图层内容。仍然没有一般解决方案 – 2013-04-18 20:40:58