UIScrollView和CATiledLayer从头开始

mar*_*mba 5 iphone sdk uiscrollview uiview catiledlayer

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

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

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

非常感谢你提前回复.

mvd*_*vds 4

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

CATiledLayer *tiled = [CATiledLayer layer];
[self.view.layer addSublayer:tiled];
Run Code Online (Sandbox Code Playgroud)

并且您设置一个委托,仅实现一种方法:

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!
}
Run Code Online (Sandbox Code Playgroud)

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

附:这只是您要求的伪代码,您可能需要一些额外的粘合剂才能使事情顺利进行,例如质量和/或帧大小。