Да, UIGestureRecognizer может быть добавлен в UIImageView. Как указано в другом ответе, очень важно помнить, чтобы разрешить взаимодействие с пользователем в представлении изображения, установив его userInteractionEnabled
свойство равным YES
. UIImageView наследует от UIView, чье свойство взаимодействия с пользователем установлено YES
по умолчанию, однако свойство взаимодействия с пользователем UIImageView установлено NO
по умолчанию.
Из документов UIImageView:
Новые объекты просмотра изображений по умолчанию настроены на игнорирование пользовательских событий. Если вы хотите обрабатывать события в пользовательском подклассе UIImageView, вы должны явно изменить значение свойства userInteractionEnabled на YES после инициализации объекта.
Во всяком случае, основная часть ответа. Вот пример того, как создать UIImageView
с a UIPinchGestureRecognizer
, a UIRotationGestureRecognizer
и aUIPanGestureRecognizer
.
Во-первых, viewDidLoad
или другим способом по вашему выбору создайте представление изображения, присвойте ему изображение, рамку и включите взаимодействие с пользователем. Затем создайте три жеста следующим образом. Обязательно используйте их делегатское свойство (скорее всего, для себя). Для этого потребуется использовать несколько жестов одновременно.
- (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>
Если вы предпочитаете поиграть с кодом в рабочем примере проекта, созданный мной пример проекта, содержащий этот код, можно найти здесь.