Да, UIGestureRecognizer может быть добавлен в UIImageView.Как указано в другом ответе, очень важно помнить, чтобы разрешить взаимодействие с пользователем в представлении изображения, установив его свойство userInteractionEnabled
в YES
.UIImageView наследует от UIView, чье свойство взаимодействия с пользователем установлено по умолчанию YES
, однако свойство взаимодействия с пользователем UIImageView установлено по умолчанию NO
.
Из документов UIImageView:
Новые объекты просмотра изображений по умолчанию настроены на игнорирование пользовательских событий.Если вы хотите обрабатывать события в пользовательском подклассе UIImageView, вы должны явно изменить значение свойства userInteractionEnabled на YES после инициализации объекта.
В любом случае, в основном ответе.Вот пример того, как создать UIImageView
с UIPinchGestureRecognizer
, UIRotationGestureRecognizer
и UIPanGestureRecognizer
.
Сначала, в viewDidLoad
или другим способом по вашему выбору, создайтепросмотрите изображение, дайте ему изображение, рамку и включите его взаимодействие с пользователем.Затем создайте три жеста следующим образом.Обязательно используйте их свойство делегата (скорее всего, для него установлено значение self).Для этого потребуется использовать несколько жестов одновременно.
- (void)viewDidLoad
{
[super viewDidLoad];
// set up the image view
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"someImage"]];
[imageView setBounds:CGRectMake(0.0, 0.0, 120.0, 120.0)];
[imageView setCenter:self.view.center];
[imageView setUserInteractionEnabled:YES]; // <--- This is very important
// create and configure the pinch gesture
UIPinchGestureRecognizer *pinchGestureRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchGestureDetected:)];
[pinchGestureRecognizer setDelegate:self];
[imageView addGestureRecognizer:pinchGestureRecognizer];
// create and configure the rotation gesture
UIRotationGestureRecognizer *rotationGestureRecognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationGestureDetected:)];
[rotationGestureRecognizer setDelegate:self];
[imageView addGestureRecognizer:rotationGestureRecognizer];
// creat and configure the pan gesture
UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panGestureDetected:)];
[panGestureRecognizer setDelegate:self];
[imageView addGestureRecognizer:panGestureRecognizer];
[self.view addSubview:imageView]; // add the image view as a subview of the view controllers view
}
Вот три метода, которые будут вызываться при обнаружении жестов на вашем виде.Внутри них мы проверим текущее состояние жеста, и если оно находится в начальном или измененном UIGestureRecognizerState
, мы прочтем свойство масштаба / вращения / перевода жеста, применим эти данные к аффинному преобразованию, применим аффинное преобразованиек представлению изображения, а затем сбросьте масштаб жестов / вращение / перевод.
- (void)pinchGestureDetected:(UIPinchGestureRecognizer *)recognizer
{
UIGestureRecognizerState state = [recognizer state];
if (state == UIGestureRecognizerStateBegan || state == UIGestureRecognizerStateChanged)
{
CGFloat scale = [recognizer scale];
[recognizer.view setTransform:CGAffineTransformScale(recognizer.view.transform, scale, scale)];
[recognizer setScale:1.0];
}
}
- (void)rotationGestureDetected:(UIRotationGestureRecognizer *)recognizer
{
UIGestureRecognizerState state = [recognizer state];
if (state == UIGestureRecognizerStateBegan || state == UIGestureRecognizerStateChanged)
{
CGFloat rotation = [recognizer rotation];
[recognizer.view setTransform:CGAffineTransformRotate(recognizer.view.transform, rotation)];
[recognizer setRotation:0];
}
}
- (void)panGestureDetected:(UIPanGestureRecognizer *)recognizer
{
UIGestureRecognizerState state = [recognizer state];
if (state == UIGestureRecognizerStateBegan || state == UIGestureRecognizerStateChanged)
{
CGPoint translation = [recognizer translationInView:recognizer.view];
[recognizer.view setTransform:CGAffineTransformTranslate(recognizer.view.transform, translation.x, translation.y)];
[recognizer setTranslation:CGPointZero inView:recognizer.view];
}
}
Наконец, что очень важно, вам нужно использовать UIGestureRecognizerDelegate метод gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer
, чтобы жесты могли работать одновременно.Если эти три жеста являются единственными тремя жестами, которым этот класс назначен в качестве их делегата, то вы можете просто вернуть YES
, как показано ниже.Однако, если у вас есть дополнительные жесты, которым этот класс назначен в качестве их делегата, вам может потребоваться добавить логику в этот метод, чтобы определить, какой это жест, прежде чем разрешить им всем работать вместе.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
Не делайтеНе забудьте убедиться, что ваш класс соответствует протоколу UIGestureRecognizerDelegate .Для этого убедитесь, что ваш интерфейс выглядит примерно так:
@interface MyClass : MySuperClass <UIGestureRecognizerDelegate>
Если вы предпочитаете поиграть с кодом в рабочем примере проекта, созданный мной пример проекта, содержащий этот код можно найти здесь.