UIScrollView和CATiledLayer从头开始

时间:2010-11-21 00:05:55

标签: iphone uiview sdk uiscrollview catiledlayer

我的情况:我创建了一个带有UIView的UIScrollView,里面调用了一个Graph类,它在上下文中绘制了一个漂亮的图形。 现在我发现如果宽度大于8192像素,手机将不会呈现UIView。事实上,根据Apple的文档,如果我想要它大于1024px,我应该实现CATiledLayer。

但是经过阅读和谷歌搜索后,我仍然发现很难理解CATiledLayer的基本功能 - 我在Quartz vs. Cocoa和图层和子图层与视图和子视图之间丢失了。

理想情况下,我想保持Graph类不变,只需完全绘制上下文,将其拆分为tile并滚动它们。 scrollview应该只是滚动水平,不需要缩放或垂直滚动​​。那可能吗?如果是这样,我该怎么办? 也许有人可以给我一个大纲,只是一些要点或伪代码,我应该如何重新构建scrollview,uiview和graph类来使用平铺。

非常感谢你提前回复。

1 个答案:

答案 0 :(得分:4)

自你提问以来已经过了一个月,但这仍然有用。我今晚刚开始使用CATiledLayer。我认为CATiledLayer背后的想法似乎是你将它添加到视图中:

CATiledLayer *tiled = [CATiledLayer layer];
[self.view.layer addSublayer:tiled];

并设置一个委托,只实现一个方法:

MyTLDelegate *myDelegate = [[MyTLDelegate alloc] init];
tiled.delegate = myDelegate;
// I haven't checked if CATiledLayer retains myDelegate, check this!

...
@implementation MyTLDelegate {

-(void)drawLayer:(CATiledLayer *)layer inContext:(CGContextRef)ctx
{
    CGRect dirtyRect = CGContextGetClipBoundingBox(ctx);
    // draw!
}

基本上就是它的所有内容,你可以只是绘制就像整个坐标空间就在那里一样。因此,您只需稍微修改Graph类,以便它可以充当CATiledLayer委托。在我的情况下,花费了20分钟,将用户体验提升了几个数量级。 (与进行繁琐的滚动,缩放和重绘自己相比)

PS。这只是你要求的伪代码,你可能需要一些额外的胶水才能让事情顺利进行,例如:质量和/或框架尺寸。