UIGestureRecognizer op UIImageView

Ik heb een UIImageView, die ik wil kunnen vergroten of verkleinen, roteren enz.

Kan een UIGestureRecognizerworden toegevoegd aan de UIImageView?

Ik zou een roteer- en knijpherkenning willen toevoegen aan een UIImageViewdie tijdens runtime zou worden gemaakt.

Hoe voeg je deze herkenningspunten toe?


Antwoord 1, autoriteit 100%

Controleer of userInteractionEnabledYESis op de UIImageView. Vervolgens kun je een gebarenherkenning toevoegen.

imageView.userInteractionEnabled = YES;
UIPinchGestureRecognizer *pgr = [[UIPinchGestureRecognizer alloc] 
    initWithTarget:self action:@selector(handlePinch:)];
pgr.delegate = self;
[imageView addGestureRecognizer:pgr];
[pgr release];
:
:
- (void)handlePinch:(UIPinchGestureRecognizer *)pinchGestureRecognizer
{
  //handle pinch...
}

Antwoord 2, autoriteit 18%

Ja, een UIGestureRecognizer kan worden toegevoegd aan een UIImageView. Zoals vermeld in het andere antwoord, is het erg belangrijk om te onthouden om gebruikersinteractie in de afbeeldingsweergave in te schakelen door de eigenschap userInteractionEnabledin te stellen op YES. UIImageView neemt over van UIView, waarvan de gebruikersinteractie-eigenschap standaard is ingesteld op YES, maar de gebruikersinteractie-eigenschap van UIImageView is standaard ingesteld op NO.

Van de UIImageView-documenten:

Nieuwe beeldweergave-objecten zijn geconfigureerd om gebruikersgebeurtenissen te negeren door:
standaard. Als u gebeurtenissen in een aangepaste subklasse van wilt afhandelen
UIImageView, moet u expliciet de waarde van de . wijzigen
userInteractionEnabled eigenschap naar YES na initialisatie van het object.

Hoe dan ook, het grootste deel van het antwoord. Hier is een voorbeeld van hoe u een UIImageViewmaakt met een UIPinchGestureRecognizer, een UIRotationGestureRecognizeren een UIPanGestureRecognizer.

Eerst, in viewDidLoad, of een andere methode van uw keuze, maakt u een afbeeldingsweergave, geeft u deze een afbeelding, een kader en schakelt u de gebruikersinteractie in. Maak vervolgens de drie gebaren als volgt. Zorg ervoor dat u hun gedelegeerde eigenschap gebruikt (waarschijnlijk ingesteld op zelf). Dit is vereist om meerdere gebaren tegelijk te gebruiken.

- (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
}

Dit zijn de drie methoden die worden aangeroepen wanneer de gebaren in uw weergave worden gedetecteerd. Binnenin zullen we de huidige staat van het gebaar controleren, en als het in de begonnen of gewijzigde UIGestureRecognizerStateis, zullen we de schaal/rotatie/vertaling eigenschap van het gebaar lezen, die gegevens toepassen op een affiene transformatie , pas de affiene transformatie toe op de afbeeldingsweergave en stel vervolgens de schaal/rotatie/vertaling van de gebaren opnieuw in.

- (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];
    }
}

Tot slot, en heel belangrijk, moet u de UIGestureRecognizerDelegate gebruiken methode gestureRecognizer: shouldRecognizeSimultaneouslyWithGestureRecognizerom de gebaren tegelijkertijd te laten werken. Als deze drie gebaren de enige drie gebaren zijn waaraan deze klasse is toegewezen als afgevaardigde, kun je eenvoudig YESretourneren, zoals hieronder wordt weergegeven. Als je echter extra gebaren hebt waaraan deze klasse is toegewezen als afgevaardigde, moet je mogelijk logica aan deze methode toevoegen om te bepalen welk gebaar is voordat ze allemaal kunnen samenwerken.

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

Vergeet niet om ervoor te zorgen dat uw klas voldoet aan de UIGestureRecognizerDelegate-protocol. Om dit te doen, moet je ervoor zorgen dat je interface er ongeveer zo uitziet:

@interface MyClass : MySuperClass <UIGestureRecognizerDelegate>

Als je liever zelf met de code in een werkend voorbeeldproject speelt, kun je het voorbeeldproject dat ik heb gemaakt met deze code hier vinden .


Antwoord 3, autoriteit 3%

Swift 4.2

myImageView.isUserInteractionEnabled = true
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped))
tapGestureRecognizer.numberOfTapsRequired = 1
myImageView.addGestureRecognizer(tapGestureRecognizer)

en wanneer erop wordt getikt:

@objc func imageTapped(_ sender: UITapGestureRecognizer) {
   // do something when image tapped
   print("image tapped")
}

4

U kunt ook slepen een kraan gebaar herkenner om de afbeelding te bekijken in Storyboard. Maak vervolgens een actie van ctrl + dragom de code.

Other episodes