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
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)
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")
}
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:
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")
}
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
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")
}
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
Je suggère de placer le bouton invisible (opacité = 0) sur votre imageview, puis de gérer l’interaction sur le bouton.
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
}