iphone - UIScrollView 和 CATiledLayer 从头开始

标签 iphone uiview sdk uiscrollview catiledlayer

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

但是在阅读和谷歌搜索了很多之后,我仍然发现很难理解用于此任务的 CATiledLayer 基础知识 - 我在 Quartz 与 Cocoa 以及层和子层与 View 和 subview 之间不知何故迷失了。

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

提前非常感谢您的回复。

最佳答案

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

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

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

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 委托(delegate)。就我而言,这 20 分钟的花费非常值得,将用户体验提升了几个数量级。 (与我自己进行繁琐的滚动、缩放和重绘相比)

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

关于iphone - UIScrollView 和 CATiledLayer 从头开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4235707/

相关文章:

android - adt eclipse 包 02-07-2014 更新

ios - Mach-O 链接器错误,将 xcode 升级到 8.0 后未定义的体系结构符号

ios - iOS防火墙应用程序

iphone - 是否可以通过 iPhone 和 Android 库使用信用卡详细信息结帐?

ios - UIView动画选项没有效果

Android Studio 2.3 Canary 在 'Launch Standalone SDK Manager' 中缺少 'SDK Manager' 选项

iphone - FBLoginView 拒绝某些用户

iphone - 适用于 iPhone 的星巴克/iPod 景观式图像浏览器

ios - 仅从 UIView 的 3 个边绘制阴影

ios - 如何让透明背景看到主屏幕?