Масштабирование изображения на iPad 4-го поколения происходит медленно, есть ли более быстрые альтернативы?

Я пытаюсь увеличить и перевести изображение на экран.

вот мой DrawRect:

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    CGContextSetShouldAntialias(context, NO);
    CGContextScaleCTM (context, senderScale, senderScale);
    [self.image drawAtPoint:CGPointMake(imgposx, imgposy)];
    CGContextRestoreGState(context);
}

Когда senderScale равно 1,0, перемещение изображения (imgposx/imgposy) происходит очень плавно. Но если senderScale имеет какое-либо другое значение, производительность сильно снижается, и изображение заикается, когда я его перемещаю.

Изображение, которое я рисую, представляет собой UIImageobject. я создаю его с

UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0.0);

и нарисуйте простой UIBezierPath(stroke):

self.image = UIGraphicsGetImageFromCurrentImageContext();  

Я делаю что-то неправильно? Отключение сглаживания не сильно улучшило ситуацию.

Изменить: я пробовал это:

rectImage = CGRectMake(0, 0, self.frame.size.width * senderScale, self.frame.size.height * senderScale);
[image drawInRect:rectImage];

но это было так же медленно, как и другой метод.


person HSNN    schedule 19.07.2013    source источник


Ответы (1)


Если вы хотите, чтобы это работало хорошо, вы должны позволить графическому процессору выполнять тяжелую работу, используя CoreAnimation вместо рисования изображения в вашем методе -drawRect:. Попробуйте создать представление и выполните:

myView.layer.contents = self.image.CGImage;

Затем масштабируйте и переводите его, манипулируя UIView относительно его супервизора. Если вы рисуете изображение в -drawRect:, вы заставляете его выполнять тяжелую работу по копированию изображения для каждого кадра. Выполнение этого с помощью CoreAnimation выполняется только один раз, а затем позволяет графическому процессору масштабировать и перемещать слой.

person ipmcc    schedule 19.07.2013
comment
Я пытался создать представление, но не мог понять, куда поместить код перевода и масштабирования. - person HSNN; 19.07.2013
comment
Для перевода вы можете просто установить происхождение frame. Для более сложных преобразований используйте свойство transform. - person ipmcc; 20.07.2013