如果它在 UIKit 中,包括drawRect
,是否会自动处理 Retina 显示的高清方面?那么这是否意味着drawRect
1024 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 表示视网膜,所以我们的x
andy
将永远是x * scaleFactor
,而y * scaleFactor
不是当我们使用 绘制时,等等)x
y
CGContextMoveToPoint
如果传入 0.0 的比例,似乎UIGraphicsBeginImageContextWithOptions
可以自动为 Retina 创建一个,但如果我需要创建上下文并保留它(并使用 ivar 或 UIViewController 的属性来保存它),我认为它不能使用. 如果我不使用 释放它UIGraphicsEndImageContext
,那么它会保留在图形上下文堆栈中,所以看来我必须CGBitmapContextCreate
改用它。(或者我们只是让它留在堆栈的底部而不担心它?)