Расхождения между границами, фреймом и фреймом, рассчитанными с помощью CGAffineTransformScale - PullRequest
0 голосов
/ 01 ноября 2011

У меня есть простое приложение, которое размещает изображение на экране и позволяет пользователю перемещать его и масштабировать с помощью распознавателей жестов и сдвига. В моем методе делегата uipangesturerecognizer (scale) я пытаюсь вычислить значение преобразованного кадра перед тем, как фактически выполнить преобразование, используя CGAffineTransformScale. Однако я не получаю правильное значение и получаю какой-то странный результат, который не соответствует тому, каким должен быть преобразованный кадр. Ниже мой метод:

- (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]) * (CropThePhotoViewControllerPinchSpeed); 

        newScale = MIN(newScale, CropThePhotoViewControllerMaxScale / currentScale);   
        newScale = MAX(newScale, CropThePhotoViewControllerMinScale / currentScale);

        NSLog(@"currentBounds: %@", NSStringFromCGRect([[sender view] bounds]));
        NSLog(@"currentFrame: %@", NSStringFromCGRect([[sender view] frame]));

        CGAffineTransform transform = CGAffineTransformScale([[sender view] transform], newScale, newScale);
        CGRect nextFrame = CGRectApplyAffineTransform([[sender view] frame], transform);

        NSLog(@"nextFrame: %@", NSStringFromCGRect(nextFrame));

        //NSLog(@"nextBounds: %@", NSStringFromCGRect(nextBounds));

        [sender view].transform = transform;
        lastScale = [sender scale];

    } 
}

Вот печатный результат, который я получаю:

/* currentBounds: {{0, 0}, {316, 236.013}} 
   currentFrame: {{-115.226,-53.4392}, {543.452, 405.891}} 
   nextFrame: {{-202.566, -93.9454}, {955.382, 713.551}} */

С этими результатами координаты currentBounds, очевидно, равны 0,0, как и всегда, а размер и ширина соответствуют исходному изображению до его преобразования. Кажется, это значение остается неизменным независимо от того, сколько преобразований я делаю.

currentFrame - это правильные координаты, а также правильный размер и ширина в зависимости от текущего состояния изображения в его преобразованном состоянии.

nextFrame неверен, он должен совпадать с currentFrame из следующего набора значений, который печатается, но это не так.

Итак, у меня есть несколько вопросов:

1) Почему currentFrame отображает правильное значение для кадра? Я думал, что кадр был недействительным после выполнения преобразований? Этот набор значений отображался после многих расширений и минимизаций, которые я делал пальцами на изображении. Кажется, что высота и ширина currentBounds - это то, что я ожидал бы для currentFrame.

2) Почему мое следующее значение кадра вычисляется неправильно, и как мне точно рассчитать значение преобразованного кадра, прежде чем я фактически осуществлю преобразование?

1 Ответ

1 голос
/ 01 ноября 2011

Вам необходимо применить новое преобразование к кадру без преобразования представления.Попробуйте это:

    CGAffineTransform transform = CGAffineTransformScale([[sender view] transform], newScale, newScale);
    CGAffineTransform iTransform = CGAffineTransformInvert([[sender view] transform]);
    CGRect rawFrame = CGRectApplyAffineTransform([[sender view] frame], iTransform);
    CGRect nextFrame = CGRectApplyAffineTransform(rawFrame, transform);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...