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