IPhone iOS, как заставить UIRotationGestureRecognizer и UIPinchGestureRecognizer работать вместе, чтобы масштабировать и поворачивать UIView с subviews?

Я использую ярлыки drag/drop/resize/rotate в моем приложении. Пока все работает, кроме жестов UIRotationGestureRecognizer. Более конкретно, он не работает с жестов UIPinchGestureRecognizer.

Обычно два жесты конкурируют за два касания пальца, поэтому я запускаю их параллельно. Ниже приведены мои 2 метода, которые активируют распознаватели жестов.

При выполнении жестов вращения вид вращается вокруг вокруг центра, а высота и ширина изменяются следующим образом: высота становится шириной, ширина медленно превращается в высоту. В конце концов, вид исчезает.

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

Что я делаю неправильно? Как я могу изменить размер и масштаб UIView с помощью жестов?

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

//makes 2 gesture recognizers behave together
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
 return YES;
}
- (********)handleRotationFrom:(id)sender {
 NSLog(@"Gesture rotation %.1f", rotationGestureRecognizer.rotation);
//attempt to continuously rotate the label, starting with a remembered rotation 
 float rotation = atan2(activeCompanionLabelView.transform.b, activeCompanionLabelView.transform.a);
 NSLog(@"existing rotation %.1f", rotation);
// rotation = rotation<0?(2*M_PI)-fabs(rotation):rotation;
 rotation +=rotationGestureRecognizer.rotation;
 NSLog(@"*** gesture rotation %.1f sum: %.1f, saved: %.1f",rotationGestureRecognizer.rotation, rotation, activeCompanionLabelView.savedRotation);
 activeCompanionLabelView.transform = CGAffineTransformMakeRotation((rotation));
 activeCompanionLabelView.savedRotation = rotation;
}
- (********)handlePinch:(id)sender {
 NSLog(@"pinch %.2f", pinchGestureRecognizer.scale);
//resize, keeping the origin where it was before
 activeCompanionLabelView.frame = CGRectMake(activeLabelContainerFrame.origin.x, activeLabelContainerFrame.origin.y, activeLabelContainerFrame.size.width*pinchGestureRecognizer.scale, activeLabelContainerFrame.size.height*pinchGestureRecognizer.scale); 
}
1 ответ

Если вы хотите, чтобы два gestureRecognisers выполнялись параллельно (одновременно) view должен реализовывать .

Кроме того, вы должны сделать его делегатом как gestureRecognizers.

rotationGestureRecognizer.delegate=self;
pinchGestureRecognizer.delegate=self;

И вы также должны реализовать метод shouldRecognizeSimultaneouslyWithGestureRecognizer::

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
 return YES;
}

ПРИМЕЧАНИЕ. Если у вас есть больше двух gestureRecognisers в вашем view, вам нужно добавить некоторую проверку подлинности в этом методе.

EDIT:

Только что нашел Ole Begemann статью по этой теме: Распознавание жестов на iOS с вниманием к деталям

licensed under cc by-sa 3.0 with attribution.