Ich versuche, UIImageView
einer 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
?
Ich versuche, UIImageView
einer 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
?
Antworten:
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 UIButton
ein Bild verwenden und ihm ein Bild ohne Text zuweisen und dann einfach ein Bild anschließen. IBAction
)
@objc
der Funktion einen Modifikator hinzufügen .
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")
}
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:
UIImageView
reagiert standardmäßig nicht auf Berührungen. Sie müssen auch Benutzerinteraktionen aktivieren.
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")
}
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 UITapGestureRecognizer
ein UIView
oder eine UIView
Unterklasse 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")
}
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
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")
}
Sie können ein Bild UIButton
mit einem transparenten Hintergrund über UIImageView
das Bild legen und auf die Schaltfläche tippen, bevor Sie das Bild laden
let pictureTap = UITapGestureRecognizer(target: self, action: #selector(MyInfoTableViewController.imageTapped))
userImageView.addGestureRecognizer(pictureTap)
userImageView.isUserInteractionEnabled = true
@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
}