web-dev-qa-db-fra.com

Comment attribuer une action à un objet UIImageView dans Swift

J'essaie d'assigner une UIImageView à une action lorsque l'utilisateur appuie dessus.

Je sais comment créer une action pour un UIButton, mais comment pourrais-je imiter le même comportement que pour un UIButton, mais en utilisant un UIImageView

150
user3706773

Vous aurez besoin d'une UITapGestureRecognizer. Pour configurer, utilisez ceci:

override func viewDidLoad()
{
    super.viewDidLoad()

    let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
    imageView.isUserInteractionEnabled = true
    imageView.addGestureRecognizer(tapGestureRecognizer)
}

func imageTapped(tapGestureRecognizer: UITapGestureRecognizer)
{
    let tappedImage = tapGestureRecognizer.view as! UIImageView

    // Your action
}

(Vous pouvez également utiliser un UIButton et lui attribuer une image, sans texte et simplement connecter un IBAction)

339
Aseider

Vous devez ajouter un identificateur de geste (pour utiliser le robinet UITapGestureRecognizer , pour appuyer et maintenir utilisez UILongPressGestureRecognizer ) à votre UIImageView.

let tap = UITapGestureRecognizer(target: self, action: #selector(YourClass.tappedMe))
imageView.addGestureRecognizer(tap)
imageView.isUserInteractionEnabled = true

Et implémentez la méthode de sélection comme:

@objc func tappedMe()
{
    println("Tapped on Image")
}
59
Midhun MP

Vous pouvez ajouter une UITapGestureRecognizer à l'imageView, faites-en simplement glisser une dans votre Storyboard/xib, faites glisser Ctrl-glisser de l'imageView vers le gestureRecognizer, puis Ctrl-glisser du gestureRecognizer vers le fichier Swift pour créer un IBAction.

Vous devrez également activer les interactions utilisateur sur la UIImageView, comme indiqué dans cette image: enter image description here

32
Emil

Pour Swift 2.0 et supérieur, faites ceci

@IBOutlet weak var imageView: UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let tap = UITapGestureRecognizer(target: self, action: #selector(ViewController.tappedMe))
        imageView.addGestureRecognizer(tap)
        imageView.userInteractionEnabled = true
    }
    func tappedMe()
    {
        print("Tapped on Image")
    }
13
Abhishek Kumar

En fait, vous pouvez simplement définir l'image de la UIButton sur ce que vous mettriez normalement dans une UIImageView. Par exemple, où vous feriez:

myImageView.image = myUIImage

Vous pourriez plutôt utiliser:

myButton.setImage(myUIImage, forState: UIControlState.Normal)

Alors, voici à quoi votre code pourrait ressembler:

override func viewDidLoad(){
  super.viewDidLoad()

  var myUIImage: UIImage //set the UIImage here
  myButton.setImage(myUIImage, forState: UIControlState.Normal)
}

@IBOutlet var myButton: UIButton!
@IBAction func buttonTap(sender: UIButton!){
  //handle the image tap
}

L'avantage de cette méthode est que si vous devez charger l'image à partir d'une base de données, vous pouvez définir le titre du bouton avant de définir l'image:

myButton.setTitle("Loading Image...", forState: UIControlState.Normal)

Pour dire à vos utilisateurs que vous chargez l'image

8
Jojodmo

Code Swift4

Essayez ceci avec de nouvelles méthodes d'extension:

import UIKit

extension UIView {

    fileprivate struct AssociatedObjectKeys {
        static var tapGestureRecognizer = "MediaViewerAssociatedObjectKey_mediaViewer"
    }

    fileprivate typealias Action = (() -> Void)?


    fileprivate var tapGestureRecognizerAction: Action? {
        set {
            if let newValue = newValue {
                // Computed properties get stored as associated objects
                objc_setAssociatedObject(self, &AssociatedObjectKeys.tapGestureRecognizer, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
            }
        }
        get {
            let tapGestureRecognizerActionInstance = objc_getAssociatedObject(self, &AssociatedObjectKeys.tapGestureRecognizer) as? Action
            return tapGestureRecognizerActionInstance
        }
    }


    public func addTapGestureRecognizer(action: (() -> Void)?) {
        self.isUserInteractionEnabled = true
        self.tapGestureRecognizerAction = action
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTapGesture))
        self.addGestureRecognizer(tapGestureRecognizer)
    }


    @objc fileprivate func handleTapGesture(sender: UITapGestureRecognizer) {
        if let action = self.tapGestureRecognizerAction {
            action?()
        } else {
            print("no action")
        }
    }

}

Maintenant, chaque fois que nous voulons ajouter une UITapGestureRecognizer à une sous-classe UIView ou UIView comme UIImageView, nous pouvons le faire sans créer de fonctions associées pour les sélecteurs!

Utilisation:

 profile_ImageView.addTapGestureRecognizer {
        print("image tapped")
    }
6
Ravindra Bhati

Vous pouvez mettre une UIButton avec un arrière-plan transparent au-dessus de la UIImageView et écouter le toucher du bouton avant de charger l'image

1
depsch ali

Je suggère de placer le bouton invisible (opacité = 0) sur votre imageview, puis de gérer l’interaction sur le bouton.

0
levan

Swift 4 Code


Étape 1 dans ViewdidLoad ()

   let pictureTap = UITapGestureRecognizer(target: self, action: #selector(MyInfoTableViewController.imageTapped))
       userImageView.addGestureRecognizer(pictureTap)
       userImageView.isUserInteractionEnabled = true

Étape 2 Ajouter la fonction suivante

@objc func imageTapped() {

        let imageView = userImageView
        let newImageView = UIImageView(image: imageView?.image)
        newImageView.frame = UIScreen.main.bounds
        newImageView.backgroundColor = UIColor.black
        newImageView.contentMode = .scaleAspectFit
        newImageView.isUserInteractionEnabled = true
        let tap = UITapGestureRecognizer(target: self, action: #selector(dismissFullscreenImage))
        newImageView.addGestureRecognizer(tap)
        self.view.addSubview(newImageView)

        self.navigationController?.isNavigationBarHidden = true
        self.tabBarController?.tabBar.isHidden = true

    }

C'est testé et fonctionne correctement

0
Sachin Rasane