В моем приложении я создаю полноэкранный вид, а затем уменьшаю его (примерно до 1/10 исходного размера), чтобы позже можно было анимировать его до полного размера. Проблема в том, что вид выглядит ужасно при таком размере и сильно пикселизирован.

Вот полноразмерный вид: введите здесь описание изображения

А вот уменьшенный вид на месте: введите здесь описание изображения

Я уменьшаю вид с помощью setFrame: - есть ли способ указать iOS использовать высококачественную интерполяцию? Или я уже получаю самую качественную интерполяцию и это лучшее, на что она способна?

0
MusiGenesis 23 Мар 2011 в 22:34

1 ответ

Я бы порекомендовал превратить вид в изображение, прежде чем его уменьшать (я предполагаю, что в настоящее время у вас есть дневной вид, состоящий из множества подпредставлений, которые вы затем просто уменьшаете, настраивая рамку).

Если вы посмотрите, то увидите, как Apple достигает этого: вместо того, чтобы буквально сжимать представление, они захватывают содержимое представления в виде изображения, заменяют представление этим изображением, а затем уменьшают изображение. Вы бы сделали это по ряду причин: эффективность (вы можете избавиться от уменьшенных представлений и заменить их одним UIImageView), скорость, а также качество.

Чтобы сохранить UIView как изображение, вы должны сделать что-то вроде:

UIGraphicsBeginImageContext(myView.bounds.size);
[myView.layer renderInContext:UIGraphicsGetCurrentContext()];
viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

... затем замените свое представление изображением и уменьшите его.

1
lxt 23 Мар 2011 в 22:40
На самом деле, мой дневной вид — это всего лишь один вид без подвидов. Все, что вы видите в дневном представлении, рисуется в drawRect. Такое ощущение, что у меня просто не получится это сделать, так как даже самые качественные режимы интерполяции не позволяют уменьшить изображение ниже 25% без потери информации.
 – 
MusiGenesis
23 Мар 2011 в 22:46
Интересно - возможно, все же стоит попробовать, потому что, если вы превратите его в изображение, вы сможете использовать встроенные функции интерполяции Quartz (CGContextSetInterpolationQuality). Полезная запись в блоге о сжатии изображений и сохранении качества находится здесь: vocaro.com/trevor/blog/2009/10/12/… — опять же, для этого вам понадобится UIImage, поэтому посмотрите код выше, чтобы узнать, как превратить ваше представление в CGImageRef
 – 
lxt
23 Мар 2011 в 22:51