Правда ли, что если он находится в UIKit, включая drawRect
, аспект HD 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).
Мы всегда можем создать 2048 x 1536 для iPad 1 и iPad 2, а также новый iPad, но он будет тратить память, процессор и мощность GPU, поскольку это требуется только для нового iPad.
Итак, мы должны использовать if () { } else { }
для создания такого растрового контекста и как мы на самом деле это делаем? И весь наш код CGContextMoveToPoint
должен быть скорректирован для отображения Retina для использования x * 2
и y * 2
против отображения без сетчатки только с помощью x, y
? Это может быть довольно грязным для кода. (или, может быть, мы можем определить локальную переменную scaleFactor
и установить ее на [[UIScreen mainScreen] scale]
, так что она будет 1 для стандартного разрешения и 2, если это сетчатка, поэтому наши x
и y
всегда будут x * scaleFactor
, y * scaleFactor
вместо x
и y
при рисовании с помощью CGContextMoveToPoint
и т.д.)
Кажется, что UIGraphicsBeginImageContextWithOptions
может создать один для Retina автоматически, если в шкале 0.0 передано значение, но я не думаю, что он может быть использован, если мне нужно создать контекст и сохранить его (и используя ivar или свойство UIViewController, чтобы удерживать его). Если я не выпущу его с помощью UIGraphicsEndImageContext
, он останется в стеке графического контекста, поэтому мне кажется, что я должен использовать CGBitmapContextCreate
. (или мы просто позволяем ему оставаться в нижней части стека и не беспокоиться об этом?)