5

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

但是在阅读和谷歌搜索了很多之后,我仍然发现很难理解 CATiledLayer 的基础知识来完成这项任务——我不知何故迷失在 Quartz 与 Cocoa 以及层和子层与视图和子视图之间。

理想情况下,我希望保持 Graph 类不受影响,只需完全绘制上下文,将其拆分为图块并滚动它们。滚动视图应该只是水平滚动,不需要缩放或垂直滚动​​。那可能吗?如果是这样,我应该如何继续?也许有人可以给我一个大纲,只是一些要点或伪代码,我应该如何重组滚动视图、uiview 和图形类以使用平铺。

非常感谢您的任何回复。

4

1 回答 1

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 分钟的花费是值得的,将用户体验提升了几个数量级。(与自己做繁琐的滚动、缩放和重绘相比)

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

于 2011-01-03T05:35:34.037 回答