Как вы определяете рамки будущей трансформации? ОБНОВЛЕНИЕ: более элегантный способ? - PullRequest
0 голосов
/ 29 октября 2011

У меня есть распознаватель жестов щипка, прикрепленный к просмотру изображения, из которого я использую щипки, чтобы увеличить и минимизировать фотографию.Ниже приведен код, который я использую в методе делегата:

- (void)scale:(UIPinchGestureRecognizer *)sender 
{
    if([sender state] == UIGestureRecognizerStateBegan) 
    {
        lastScale = [sender scale];
    }

    if ([sender state] == UIGestureRecognizerStateBegan || 
        [sender state] == UIGestureRecognizerStateChanged) 
    {

        CGFloat currentScale = [[[sender view].layer valueForKeyPath:@"transform.scale"] floatValue];


        CGFloat newScale = 1 -  (lastScale - [sender scale]) * (UIComicImageViewPinchSpeed); 
        newScale = MIN(newScale, minScale / currentScale);   
        newScale = MAX(newScale, maxScale / currentScale);
        CGAffineTransform transform = CGAffineTransformScale([[sender view] transform], newScale, newScale);
        [sender view].transform = transform;

        lastScale = [sender scale];   
    } 
}

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

ОБНОВЛЕНИЕ

Спасибо Робину, ниже, за то, что он предложил этот метод, чтобы выяснить преобразованный кадр.Проблема, с которой я сейчас сталкиваюсь, заключается в том, что кадр становится недействительным после выполнения преобразования, и мне нужно отслеживать самый последний кадр, чтобы выяснить границу моего изображения.Очевидно, я могу сделать это вручную и сохранить его в переменной экземпляра, но мне интересно, есть ли более «элегантный» способ сделать это?

1 Ответ

2 голосов
/ 29 октября 2011

Используйте CGRectApplyAffineTransform как это:

CGRect currentFrame = ....;

CGRect newFrame = CGRectApplyAffineTransform(currentFrame, transform);

// Then test if newFrame is within the limits you want
...