如果它在 UIKit 中,包括drawRect,是否会自动处理 Retina 显示的高清方面?那么这是否意味着drawRect1024 x 768 视图的当前图形上下文实际上是 2048 x 1536 像素位图上下文?
(更新:如果我使用当前上下文创建图像drawRect并打印其大小:
CGContextRef context = UIGraphicsGetCurrentContext();
CGImageRef image = CGBitmapContextCreateImage(context);
NSLog(@"width of context %i", (int) CGImageGetWidth(image));
NSLog(@"height of context %i", (int) CGImageGetHeight(image));
然后在新 iPad 上,禁用状态栏,打印 2048 和 1536,iPad 2 将显示 1024 和 768)
我们实际上享受自动为我们处理的 1 点 = 4 像素的奢侈。
但是,如果我们使用CGBitmapContextCreate,那么那些真的是像素,而不是点?(至少如果我们为那个位图提供一个数据缓冲区,那么缓冲区的大小(字节数)显然不是为了更高分辨率,而是为了标准分辨率,即使我们NULL作为缓冲区传递,以便CGBitmapContextCreate为我们处理缓冲区,大小可能和我们传入一个数据缓冲区一样,只是标准分辨率,而不是 Retina 的分辨率)。
我们总是可以为 iPad 1 和 iPad 2 以及新 iPad 创建 2048 x 1536,但它会浪费内存、处理器和 GPU 能力,因为只有新 iPad 才需要它。
那么我们是否必须使用 aif () { } else { }来创建这样的位图上下文,我们实际上是如何做到的呢?并且我们所有的代码CGContextMoveToPoint都必须针对 Retina 显示器进行调整以使用x * 2和y * 2与非 Retina 显示器一样使用x, y?这对代码来说可能非常混乱。(或者也许我们可以定义一个局部变量scaleFactor并将其设置[[UIScreen mainScreen] scale]为 1 表示标准分辨率,2 表示视网膜,所以我们的xandy将永远是x * scaleFactor,而y * scaleFactor不是当我们使用 绘制时,等等)xyCGContextMoveToPoint
如果传入 0.0 的比例,似乎UIGraphicsBeginImageContextWithOptions可以自动为 Retina 创建一个,但如果我需要创建上下文并保留它(并使用 ivar 或 UIViewController 的属性来保存它),我认为它不能使用. 如果我不使用 释放它UIGraphicsEndImageContext,那么它会保留在图形上下文堆栈中,所以看来我必须CGBitmapContextCreate改用它。(或者我们只是让它留在堆栈的底部而不担心它?)