【问题标题】:UIScrollView and CATiledLayer from the ground up从头开始的 UIScrollView 和 CATiledLayer
【发布时间】:2011-05-13 06:01:54
【问题描述】:

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

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

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

非常感谢您的任何回复。

【问题讨论】:

    标签: iphone uiview sdk uiscrollview catiledlayer


    【解决方案1】:

    自您询问以来已经一个月了,但这可能仍然有用。我今晚才开始使用 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。这只是您要求的伪代码,您可能需要一些额外的胶水才能使事情顺利进行,例如质量和/或帧大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      • 1970-01-01
      • 2015-09-15
      • 2012-12-21
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      相关资源
      最近更新 更多