Правда ли, что если это в 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));
то на новом айпаде с отключенной строкой состояния печатается 2048 и 1536, а айпад 2 покажет 1024 и 768)
На самом деле мы наслаждаемся роскошью: 1 точка = 4 пикселя, которые автоматически обрабатываются для нас.
Однако, если мы используем CGBitmapContextCreate
, то это действительно будут пиксели, а не точки? (по крайней мере, если мы предоставляем буфер данных для этого растрового изображения, размер буфера (количество байтов), очевидно, не для более высокого разрешения, а для стандартного разрешения, и даже если мы передаем NULL
в качестве буфера, чтобы CGBitmapContextCreate
обрабатывал буфер для нас размер, вероятно, такой же, как если бы мы передавали буфер данных, и это просто стандартное разрешение, а не разрешение Retina).
Мы всегда можем создать разрешение 2048 x 1536 для iPad 1 и iPad 2, а также для нового iPad, но это приведет к пустой трате памяти, мощности процессора и графического процессора, поскольку оно необходимо только для нового 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
. (или мы просто оставляем его внизу стека и не беспокоимся об этом?)