Je suis nouveau sur Swift (et développement de Xcode en général) et je me demandais comment rendre une ImageView sur le storyboard cliquable. Ce que j'essaie de faire, c'est de le faire quand on clique dessus, il montre un autre contrôleur de vue.
Vous pouvez ajouter tapGesture pour cela. Voici le code:
class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// create tap gesture recognizer
let tapGesture = UITapGestureRecognizer(target: self, action: "imageTapped:")
// add it to the image view;
imageView.addGestureRecognizer(tapGesture)
// make sure imageView can be interacted with by user
imageView.userInteractionEnabled = true
}
func imageTapped(gesture: UIGestureRecognizer) {
// if the tapped view is a UIImageView then set it to imageview
if let imageView = gesture.view as? UIImageView {
println("Image Tapped")
//Here you can initiate your new ViewController
}
}
}
Swift 3.
class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// create tap gesture recognizer
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.imageTapped(gesture:)))
// add it to the image view;
imageView.addGestureRecognizer(tapGesture)
// make sure imageView can be interacted with by user
imageView.isUserInteractionEnabled = true
}
func imageTapped(gesture: UIGestureRecognizer) {
// if the tapped view is a UIImageView then set it to imageview
if (gesture.view as? UIImageView) != nil {
print("Image Tapped")
//Here you can initiate your new ViewController
}
}
}
Swift 5.
class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// create tap gesture recognizer
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.imageTapped(gesture:)))
// add it to the image view;
imageView.addGestureRecognizer(tapGesture)
// make sure imageView can be interacted with by user
imageView.isUserInteractionEnabled = true
}
@objc func imageTapped(gesture: UIGestureRecognizer) {
// if the tapped view is a UIImageView then set it to imageview
if (gesture.view as? UIImageView) != nil {
print("Image Tapped")
//Here you can initiate your new ViewController
}
}
}
Vous pouvez le faire encore plus facilement et rendre une image cliquable via Storyboard sans aucun codage .
UITapGestureRecognizer
sur votre UIImageView
dans Storyboard.@IBAction func imageClicked(_ sender: Any) {}
UITapGestureRecognizer
au IBAction
de votre classe en sélectionnant le reconnaisseur de gestes dans le Document Outline
, puis basculer vers Connection Inspector Tab
et en faisant glisser le Sent Actions
-> Selector
dans votre UIViewController
où vous sélectionnez ensuite l'action appropriée que vous avez créée précédemment.User Interaction Enabled
sur la vue de l'image.Terminé, un UIImageView entièrement cliquable sans écrire une seule ligne de code, sauf la fonction évidente que vous souhaitez invoquer. Mais bon, si vous voulez par exemple pousser un enchaînement à la place, alors vous pouvez vous passer de tout codage en utilisant les identificateurs de gestes Triggered Segues
au lieu de son Sent Actions
.
Bien que le Storyboard ait ses limites, il n'est pas nécessaire d'écrire du code pour les images cliquables. ;)
Je suggérerais plutôt de créer un bouton UIB sans texte et d'en faire l'image que vous souhaitez. Après cela, vous pouvez faire glisser CTRL de l'image vers le contrôleur de vue auquel vous souhaitez vous connecter. Ou vous pouvez simplement créer une IBAction dans le code de votre contrôleur de vue qui enchaîne manuellement.
pour Swift version 3.0 essayez le code ci-dessous
override func viewDidLoad() {
super.viewDidLoad()
let tap1 = UITapGestureRecognizer(target: self, action: #selector(tapGesture1))
imageview.addGestureRecognizer(tap1)
imageview.isUserInteractionEnabled = true
}
func tapGesture1() {
print("Image Tapped")
}
Sur le scénarimage, l'interaction utilisateur de l'affichage d'image est activée, puis obtenez cette méthode
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
if ([touch view] == yourImageView)
{
//add your code for image touch here
}
}
J'ai atteint cet objectif en définissant l'interaction utilisateur enable = true
et ce code ci-dessous dans TouchesBegan ... Propre et simple pour cela
ImageView était également à l'intérieur d'un StackView
if let touch = touches.first {
if touch.view == profilePicture {
print("image touched")
}
}
Eh bien, bien que vous puissiez utiliser un UITapGestureRecognizer comme mentionné ci-dessus, si vous avez besoin de faire un projet rapide et de vous soucier des fonctionnalités de l'application, le moyen le plus simple est d'avoir un bouton transparent couvrant votre UIImageView sans texte, puis de l'utiliser pour écrire le code que vous voulez. Bien sûr, cela ne sera pas recommandé si vous faites un projet très important ou quelque chose mais si vous voulez juste faire une application rapide (disons un MVP très simple pour une réunion), cette méthode devrait fonctionner correctement.