У меня есть простое приложение, которое размещает изображение на экране и позволяет пользователю перемещать его и масштабировать с помощью распознавателей жестов и сдвига. В моем методе делегата 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) Почему мое следующее значение кадра вычисляется неправильно, и как мне точно рассчитать значение преобразованного кадра, прежде чем я фактически осуществлю преобразование?