Sì, un UIGestureRecognizer può essere aggiunto a UIImageView. Come indicato nell'altra risposta, è molto importante ricordare di abilitare l'interazione dell'utente sulla vista dell'immagine impostando la sua userInteractionEnabled
proprietà su YES
. UIImageView eredita da UIView, la cui proprietà di interazione dell'utente è impostata di YES
default, tuttavia, la proprietà di interazione dell'utente di UIImageView è impostata di NO
default.
Dai documenti UIImageView:
I nuovi oggetti vista immagine sono configurati per ignorare gli eventi utente per impostazione predefinita. Se si desidera gestire gli eventi in una sottoclasse personalizzata di UIImageView, è necessario modificare esplicitamente il valore della proprietà userInteractionEnabled su YES dopo aver inizializzato l'oggetto.
Comunque, sulla maggior parte della risposta. Ecco un esempio di come creare a UIImageView
con a UIPinchGestureRecognizer
, a UIRotationGestureRecognizer
e a UIPanGestureRecognizer
.
Innanzitutto, in viewDidLoad
o un altro metodo a tua scelta, crea una vista immagine, assegnale un'immagine, una cornice e abilita l'interazione dell'utente. Quindi crea i tre gesti come segue. Assicurati di utilizzare la proprietà del delegato (molto probabilmente impostata su self). Ciò sarà necessario per utilizzare più gesti contemporaneamente.
- (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
}
Ecco i tre metodi che verranno chiamati quando vengono rilevati i gesti nella tua vista. Al loro interno, controlleremo lo stato corrente del gesto e, se è nella fase iniziale o modificata UIGestureRecognizerState
, leggeremo la proprietà della scala / rotazione / traduzione del gesto, applicheremo quei dati a una trasformazione affine, applicheremo la trasformazione affine all'immagine visualizzare, quindi ripristinare la scala / rotazione / traduzione dei gesti.
- (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];
}
}
Infine e, cosa molto importante, dovrai utilizzare il metodo UIGestureRecognizerDelegategestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer
per consentire ai gesti di funzionare contemporaneamente. Se questi tre gesti sono i soli tre gesti a cui questa classe è assegnata come delegato, puoi semplicemente tornare YES
come mostrato di seguito. Tuttavia, se hai gesti aggiuntivi a cui è assegnata questa classe come delegato, potresti dover aggiungere la logica a questo metodo per determinare quale gesto è quale prima di consentire loro di lavorare tutti insieme.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
Non dimenticare di assicurarti che la tua classe sia conforme al protocollo UIGestureRecognizerDelegate . Per fare ciò, assicurati che la tua interfaccia sia simile a questa:
@interface MyClass : MySuperClass <UIGestureRecognizerDelegate>
Se preferisci giocare tu stesso con il codice in un progetto di esempio funzionante, puoi trovare il progetto di esempio che ho creato contenente questo codice qui.