Ja, ein UIGestureRecognizer kann zu einer UIImageView hinzugefügt werden. Wie in der anderen Antwort angegeben, ist es sehr wichtig, sich daran zu erinnern, die Benutzerinteraktion in der Bildansicht zu aktivieren, indem die userInteractionEnabled
Eigenschaft auf festgelegt wird YES
. UIImageView erbt von UIView, dessen Benutzerinteraktionseigenschaft YES
standardmäßig festgelegt ist. Die Benutzerinteraktionseigenschaft von UIImageView ist jedoch NO
standardmäßig festgelegt.
Aus den UIImageView-Dokumenten:
Neue Bildansichtsobjekte sind so konfiguriert, dass Benutzerereignisse standardmäßig ignoriert werden. Wenn Sie Ereignisse in einer benutzerdefinierten Unterklasse von UIImageView verarbeiten möchten, müssen Sie den Wert der Eigenschaft userInteractionEnabled nach der Initialisierung des Objekts explizit in YES ändern.
Wie auch immer, auf den Großteil der Antwort. Hier ist ein Beispiel, wie Sie ein UIImageView
mit a UIPinchGestureRecognizer
, a UIRotationGestureRecognizer
und a erstellen UIPanGestureRecognizer
.
viewDidLoad
Erstellen Sie zunächst in oder einer anderen Methode Ihrer Wahl eine Bildansicht, geben Sie ihr ein Bild und einen Rahmen und aktivieren Sie die Benutzerinteraktion. Erstellen Sie dann die drei Gesten wie folgt. Stellen Sie sicher, dass Sie die Eigenschaft delegate verwenden (höchstwahrscheinlich auf self eingestellt). Dies ist erforderlich, um mehrere Gesten gleichzeitig zu verwenden.
- (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
}
Hier sind die drei Methoden, die aufgerufen werden, wenn die Gesten in Ihrer Ansicht erkannt werden. In ihnen überprüfen wir den aktuellen Status der Geste. Wenn sie sich entweder in der begonnenen oder in der geänderten UIGestureRecognizerState
Form befindet, lesen wir die Skalierungs- / Rotations- / Übersetzungseigenschaft der Geste, wenden diese Daten auf eine affine Transformation an und wenden die affine Transformation auf das Bild an Zeigen Sie die Gesten an: Skalieren / Drehen / Verschieben.
- (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];
}
}
Schließlich und vor allem müssen Sie die UIGestureRecognizerDelegate- Methode verwenden gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizer
, damit die Gesten gleichzeitig funktionieren. Wenn diese drei Gesten die einzigen drei Gesten sind, denen diese Klasse als Delegat zugewiesen ist, können Sie einfach YES
wie unten gezeigt zurückkehren. Wenn Sie jedoch zusätzliche Gesten haben, denen diese Klasse als Delegat zugewiesen ist, müssen Sie dieser Methode möglicherweise Logik hinzufügen, um zu bestimmen, welche Geste welche ist, bevor sie alle zusammenarbeiten können.
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
Vergessen Sie nicht sicherzustellen, dass Ihre Klasse dem UIGestureRecognizerDelegate- Protokoll entspricht. Stellen Sie dazu sicher, dass Ihre Benutzeroberfläche ungefähr so aussieht:
@interface MyClass : MySuperClass <UIGestureRecognizerDelegate>
Wenn Sie es vorziehen, selbst mit dem Code in einem funktionierenden Beispielprojekt zu spielen, finden Sie das von mir erstellte Beispielprojekt mit diesem Code hier.