如果使用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像素的奢侈,这一切都被自动处理。
然而,如果我们使用,那么它们将真正成为像素而不是点?(至少如果我们为该位图提供数据缓冲区,则缓冲区的大小(字节数)显然不是针对更高分辨率的,而是普通分辨率,即使我们将null
作为缓冲区传递给以便由它来处理缓冲区,大小可能与我们传递数据缓冲区时相同,因为它只是标准分辨率,而不是Retina的分辨率)。
我们总是可以为iPad 1和iPad 2以及新版iPad创建2048 x 1536,但这将会浪费内存、处理器和GPU的功率,因为它只有在新版iPad上才需要。
那么我们必须使用if () { } else { }
来创建这样的位图上下文,我们如何实际做到这一点呢?而所有的代码CGContextMoveToPoint
都必须针对Retina显示做出调整,使用x * 2
和y * 2
而不是非Retina显示的只使用x, y
。这可能会让代码变得很混乱。(或者我们可以定义一个本地变量scaleFactor
并将其设置为[[UIScreen mainScreen] scale]
,因此它在标准分辨率下为1,在Retina下为2,因此我们的x
和y
将始终为x * scaleFactor
,y * scaleFactor
,而不仅仅是在使用CGContextMoveToPoint
等进行绘制时使用x
和y
)。
似乎UIGraphicsBeginImageContextWithOptions
如果传入0.0的比例尺,则可以自动创建Retina版本,但我认为如果需要创建上下文并保留它(并使用UIViewController的ivar或property来保存它),则无法使用它。如果我不使用UIGraphicsEndImageContext
释放它,则它将保留在图形上下文堆栈中,因此似乎我必须使用代替。(或者我们只是让它保持在堆栈底部,不用担心它吗?)
UIGraphicsBeginImageContextWithOptions
并且没有立即释放它,那么如果其他上下文被推入堆栈,那么当该上下文不在堆栈顶部时,我们可以使用UIGraphicsEndImageContext
吗? - nonopolarityCGBitmapContextCreate
,那么是的,我们必须手动处理Retina分辨率,为我们的x和y使用一个scaleFactor? - nonopolarityUIGraphicsCreateImageContextWithOptions
,如果我们使用CGContextMoveToPoint
等进行绘制,仍然需要手动处理x和y,通过x * scaleFactor
和y * scaleFactor
。 - nonopolarity