J'essaie d'attribuer un UIImageView
à une action lorsque l'utilisateur la touche.
Je sais comment créer une action pour a UIButton
, mais comment pourrais-je imiter le même comportement de a UIButton
, mais en utilisant a UIImageView
?
J'essaie d'attribuer un UIImageView
à une action lorsque l'utilisateur la touche.
Je sais comment créer une action pour a UIButton
, mais comment pourrais-je imiter le même comportement de a UIButton
, mais en utilisant a UIImageView
?
Réponses:
Vous aurez besoin d'un 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)
}
@objc 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
)
@objc
modificateur à la fonction.
Vous devez ajouter un outil de reconnaissance de gestes (pour appuyer, utiliser UITapGestureRecognizer , pour appuyer et maintenir, utiliser 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 un UITapGestureRecognizer
à l'imageView, faites-en simplement glisser un dans votre Storyboard / xib, faites glisser tout en maintenant la touche Ctrl enfoncée de l'imageView vers le gestureRecognizer et en maintenant la touche Ctrl enfoncée depuis le gestureRecognizer vers le fichier Swift pour créer unIBAction
.
Vous devrez également activer les interactions des utilisateurs sur le UIImageView
, comme indiqué dans cette image:
UIImageView
ne répond pas aux touches par défaut. Vous devez également activer les interactions des utilisateurs.
Pour swift 2.0 et supérieur, procédez comme suit
@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")
}
Code Swift4
Essayez ces 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 un UITapGestureRecognizer
à une UIView
ou une UIView
sous - classe commeUIImageView
, nous pouvons le faire sans créer de fonctions associées pour les sélecteurs!
Usage:
profile_ImageView.addTapGestureRecognizer {
print("image tapped")
}
Vous pouvez en fait simplement définir l'image du UIButton
à ce que vous mettriez normalement dans un fichier UIImageView
. Par exemple, où vous feriez:
myImageView.image = myUIImage
Vous pouvez à la place utiliser:
myButton.setImage(myUIImage, forState: UIControlState.Normal)
Alors, voici à quoi pourrait ressembler votre code:
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 d'utiliser 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 informer vos utilisateurs que vous chargez l'image
Besoin d'ajouter un paresseux pour que TapGestureRecognizer s'enregistre
puisque le 'self' dans UITapGestureRecognizer (cible: self ...) sera nul si ce n'est pas une var paresseuse. Même si vous définissez isUserInteractionEnable = true, il ne s'enregistrera pas sans lazy var.
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")
}
Vous pouvez mettre un UIButton
avec un fond transparent sur le dessus de UIImageView
, et écouter un appui sur le bouton avant de charger l'image
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
}