So weisen Sie eine Aktion für das UIImageView-Objekt in Swift zu

186

Ich versuche, UIImageVieweiner Aktion eine zuzuweisen , wenn der Benutzer darauf tippt.

Ich weiß, wie man eine Aktion für a erstellt UIButton, aber wie kann ich das gleiche Verhalten von a nachahmen UIButton, aber a verwenden UIImageView?

user3706773
quelle

Antworten:

421

Du brauchst eine UITapGestureRecognizer. Verwenden Sie zum Einrichten Folgendes:

override func viewDidLoad()
{
    super.viewDidLoad()

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

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

    // Your action
}

(Sie können auch UIButtonein Bild verwenden und ihm ein Bild ohne Text zuweisen und dann einfach ein Bild anschließen. IBAction)

Aseider
quelle
3
Nitpick: var tgr = UITapGestureRecognizer (Ziel: Selbstaktion: Selektor ("imageTapped:")) benötigt ein Komma zwischen den beiden Parametern.
Sysuser
3
Wie unten von MidHun MP angegeben, stellen Sie sicher, dass Sie die userInteractionEnabled = true
Sheraz
2
In Swift 3.0 wurde die Syntax von Aktion: Selector ("imageTapped:") in Aktion geändert: #selector (imageTapped))
Emily
2
Auch in Swift 3.0 wurde die Eigenschaft userInteractionEnabled in isUserInteractionEnabled
Doug Amos umbenannt
2
Mit Swift 4 funktionierte dies für mich, aber ich musste @objcder Funktion einen Modifikator hinzufügen .
Mark Lyons
68

Sie müssen eine Gestenerkennung hinzufügen (für die Verwendung durch Tippen UITapGestureRecognizer , zum Tippen und Halten verwenden Sie UILongPressGestureRecognizer ) zu Ihrem hinzufügenUIImageView .

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

Und implementieren Sie die Auswahlmethode wie folgt:

@objc func tappedMe()
{
    println("Tapped on Image")
}
Midhun MP
quelle
13
userInteractionEnabled ist der Schlüssel.
Kennydust
@hatim: Was ist das Problem, mit dem Sie konfrontiert sind? Wenn Sie ein neues Problem haben, stellen Sie es bitte als neue Frage.
Midhun MP
@MidhunMP Ich generiere die Bildansicht dynamisch und habe genau das getan, was in dieser Antwort geschrieben steht, aber die Funktion tappedMe () wird nicht aufgerufen
hatim
1
Es hat bei mir mit den folgenden Änderungen funktioniert: let tap = UITapGestureRecognizer (Ziel: self, Aktion: #selector (ViewController.tappedMe)) // nächste Zeile -> successIndicatorImg.addGestureRecognizer (tippen) // nächste Zeile -> successIndicatorImg.isUserInteractionEnabled = wahr
Almir Campos
@hatim verwenden Sie dieselbe Geste für mehrere Benutzeroberflächenansichten? Ich habe dieses Problem gerade gelöst, da ich dieselbe Geste für mehrere Ansichten verwendet habe und nur eine für mich funktioniert hat. Wenn ich mehrere Gesten erstelle, hat es bei mir funktioniert.
Nadafafif
36

Sie können eine hinzufügen UITapGestureRecognizer der imageView , indem Sie eine in Ihr Storyboard / xib ziehen, bei gedrückter Strg-Taste aus der imageView in den gestureRecognizer und bei gedrückter Strg-Taste aus der gestureRecognizer in die Swift-Datei ziehen, um eine zu erstellen IBAction.

Sie müssen auch Benutzerinteraktionen auf dem aktivieren UIImageView, wie in diesem Bild gezeigt: Geben Sie hier die Bildbeschreibung ein

Emil
quelle
4
UIImageViewreagiert standardmäßig nicht auf Berührungen. Sie müssen auch Benutzerinteraktionen aktivieren.
rmaddy
@rmaddy Ups, das stimmt. Bearbeitet.
Emil
1
Mir gefällt, wie Sie dies mit dem IB einrichten können. Drag / Drop ist leistungsstark und hat nicht erwartet, dass dies möglich ist. +1 dafür. Als Noob wäre es leicht, nicht zu wissen, wie es verbunden ist, ohne das Storyboard zu "bewegen". Es hängt von Ihrer Präferenz ab, aber ich ziehe es vor, "es im Code zu sehen".
AngryITguy
13

Für Swift 2.0 und höher tun Sie dies

@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")
    }
Abhishek Kumar
quelle
userInteractionEnabled wurde jetzt in isUserInteractionEnabled
Chaim Friedman
11

Swift4 Code

Probieren Sie einige neue Erweiterungsmethoden aus:

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")
        }
    }

}

Wann immer wir UITapGestureRecognizerein UIViewoder eine UIViewUnterklasse wie hinzufügen möchtenUIImageView , können wir dies tun, ohne zugehörige Funktionen für Selektoren zu erstellen!

Verwendung:

 profile_ImageView.addTapGestureRecognizer {
        print("image tapped")
    }
Ravindra_Bhati
quelle
2
Funktioniert super. und es hat die Implementierung bei weitem sehr vereinfacht.
Nick N
macht mir ein bisschen Angst mit den verwendeten Reflexionsfunktionen - gibt es eine gute Chance, dass dies in zukünftigen schnellen Versionen funktioniert?
BananaAcid
1
Das ist sehr elegant und hilfreich. Arbeitet für mich
Taylor Maxwell
2
❤️Ich liebe Erweiterungen
Ricardo
8

Sie könnten das Bild des einfach auf das einstellen UIButton, was Sie normalerweise in ein Bild einfügen würden UIImageView. Zum Beispiel, wo Sie tun würden:

myImageView.image = myUIImage

Sie könnten stattdessen verwenden:

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

So könnte Ihr Code aussehen:

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
}

Das Tolle an dieser Methode ist, dass Sie, wenn Sie das Bild aus einer Datenbank laden müssen, den Titel der Schaltfläche festlegen können, bevor Sie das Bild festlegen:

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

Um Ihren Benutzern mitzuteilen, dass Sie das Bild laden

Jojodmo
quelle
2

Sie müssen faul hinzufügen, damit TapGestureRecognizer registriert wird,
da das 'Selbst' in UITapGestureRecognizer (Ziel: Selbst ...) gleich Null ist, wenn es sich nicht um eine faule Variable handelt. Selbst wenn Sie isUserInteractionEnable = true festlegen, wird es ohne Lazy Var nicht registriert.

lazy var imageSelector : UIImageView = {
    let image = UIImageView(image: "imageName.png")
    //now add tap gesture
    image.isUserInteractionEnabled = true
    image.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleImageSelector)))
    return image
}()
@objc private func handleImageSelector() {
    print("Pressed image selector")
}
Candyline
quelle
1

Sie können ein Bild UIButtonmit einem transparenten Hintergrund über UIImageViewdas Bild legen und auf die Schaltfläche tippen, bevor Sie das Bild laden

depsch ali
quelle
1
Es ist eine schnelle Art, eine Option zu beschreiben. Ich dachte, das wüsste jeder!
Depsch Ali
3
Es ist keine gute Idee, unnötige UI-Komponenten ohne wirklichen Grund hinzuzufügen. Dies erhöht die Komplexität der Benutzeroberfläche und Sie müssen sich mit denselben Einschränkungen für das automatische Layout auseinandersetzen. Es ist nur besser, einen TapGestureRecognizer hinzuzufügen.
Gunhan
1

Swift 4 Code


Schritt 1 In ViewdidLoad ()

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

Schritt 2 Fügen Sie die folgende Funktion hinzu

@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

    }

Es ist getestet und funktioniert richtig

Sachin Rasane
quelle
0

Ich schlage vor, eine unsichtbare Schaltfläche (Deckkraft = 0) in Ihrer Bildansicht zu platzieren und dann die Interaktion auf der Schaltfläche durchzuführen.

levan
quelle