Comment faire une UIImageView tappable et de l'amener à faire quelque chose? (Swift)
(Je viens de commencer l'utilisation de Swift il y a quelques jours et je suis relativement nouveau à la programmation, de sorte s'il vous plaît garder avec moi.) Je suis en train de faire des blocs aléatoires apparaissent sur l'écran, et l'utilisateur doit appuyer sur eux pour les faire disparaître. J'ai été en mesure de créer des blocs, mais je n'ai aucune idée de comment faire tappable. Quelqu'un peut-il m'aider? C'est mon code pour l'instant:
func createBlock(){
let imageName = "block.png"
let image = UIImage(named: imageName)
let imageView = UIImageView(image: image!)
imageView.frame = CGRect(x: xPosition, y: -50, width: size, height: size)
self.view.addSubview(imageView)
UIView.animateWithDuration(duration, delay: delay, options: options, animations: {
imageView.backgroundColor = UIColor.redColor()
imageView.frame = CGRect(x: self.xPosition, y: 590, width: self.size, height: self.size)
}, completion: { animationFinished in
imageView.removeFromSuperview()
})
}
C'est le nouveau code:
func createBlock(){
let imageName = "block.png"
let image = UIImage(named: imageName)
let imageView = UIImageView(image: image!)
imageView.frame = CGRect(x: xPosition, y: -50, width: size, height: size)
self.view.addSubview(imageView)
imageView.userInteractionEnabled = true
let tapRecognizer = UITapGestureRecognizer(target: self, action: Selector("imageTapped"))
imageView.addGestureRecognizer(tapRecognizer)
func imageTapped(gestureRecognizer: UITapGestureRecognizer) {
let tappedImageView = gestureRecognizer.view!
tappedImageView.removeFromSuperview()
score += 10
}
UIView.animateWithDuration(duration, delay: delay, options: options, animations: {
imageView.backgroundColor = UIColor.redColor()
imageView.frame = CGRect(x: self.xPosition, y: 590, width: self.size, height: self.size)
}, completion: { animationFinished in
imageView.removeFromSuperview()
})
}
OriginalL'auteur Leonard Parisi | 2015-02-15
Vous devez vous connecter pour publier un commentaire.
Une fois que vous avez créer la vue, vous devez définir c'est userInteractionEnabled true à la propriété. Ensuite, vous devez joindre un geste vers elle.
Maintenant, vous avez encore besoin de la fonction, dans ce cas imageTapped:, qui est l'endroit où l'action se passe lorsque le geste est reconnu. Le geste qui a été reconnu sera transmise en argument, et vous pouvez trouver qui imageView était capté à partir d'elles des gestes de vue de la propriété.
c'est un peu gênant, mais je ne peux toujours pas comprendre! J'ai donc ajouté le code que vous avez suggéré et dans la fonction "imageTapped" je viens de supprimer le "tappedimageview" de superview. Lorsque j'ai fait exécuter le programme, rien ne se passe quand j'appuie sur les blocs ):
pouvez-vous mettre un point d'arrêt ou d'une impression sur la fonction pour vous assurer qu'il est appelé? Comment êtes-vous de retirer le taraudé image de la super vue?
J'ai posté le nouveau code de sorte que vous pouvez voir ce que j'ai ajouté dans la fonction. Je ne pense pas qu'il fonctionne bien; quand quelque chose est pressé, il est censé augmenté le score par 10, et j'ai un NSTimer qui exécute une fonction qui met à jour le score de chaque seconde, de sorte que le joueur peut voir le score.
Deux amincit. Cible: soi est en se référant à la classe (probablement votre ViewController classe), de sorte qu'il est à la recherche d'une méthode à l'intérieur de la classe. Il semble que vous avez de la méthode à l'intérieur de la createBlock méthode. Déplacer à l'extérieur de la classe elle-même.
OriginalL'auteur Jeremy Pope
Dans swift 3.0:
Et la cible de la méthode:
@objc
déclarée avant.OriginalL'auteur Javier Calatrava Llavería
Ma réponse précédente est toujours précis pour l'ajout d'un robinet de reconnaissance pour une UIImageView, cependant il n'est pas suffisant pour les fins d'un point de vue animation. Si vous êtes à la création d'un jeu, vous aurez probablement envie de regarder dans SpriteKit, comme il est littéralement taillé pour cela. Cependant, cela peut être fait avec la normale UIKit. J'ai testé deux approches, qui travaillent tous les deux.
Les deux approches a travaillé beaucoup mieux sur un périphérique réel que dans le simulateur
S'approche de 1, plus Simple mais un peu moins précis jusqu'à un dixième de seconde plus lent dans mes tests.
Au lieu de l'ajout d'un robinet, d'un geste de la UIImageView, ajouter le geste à la superview. De conserver une référence à vos blocs dans un tableau de propriété, et de vérifier si tous les blocs sont interceptés par le robinet.
Approche 2, le Meilleur de la Performance à l'extérieur de SpriteKit
Dans l'approche à deux, vous sous-classe UIView, et de définir votre vue principale à la place de la UIView. Vous avez seulement besoin de remplacer une seule méthode. Je suis stocker le bloc de tableau dans la vue pour des raisons de commodité.
D'abord le TouchView.
Maintenant le ViewController ressemblerait à:
Dans mes tests, cela semble fonctionner assez bien, même avec la plus animée de "blocs". Encore une fois, si vous pensez faire des part entière de jeu, vous devriez vraiment regarder SpriteKit. Il est vraiment simple tutoriel ici qui devrait vous obtenir a commencé. Si vous pouvez supprimer l'on a accepté la réponse de ma réponse précédente, qui permettrait d'aider les autres à ne pas être conduire dans le mauvais chemin, à moins qu'ils ne cherchent à ajouter un geste à un non-mouvement UIImageView.
OriginalL'auteur Jeremy Pope
Utilisant à la place un
UIImageView
, vous pouvez essayer d'utiliser un CustomeUIButton
et remplacer le bouton par défaut de l'image avec la vôtre. Par conséquent, vous n'avez pas besoin d'ajouterUITapGestureRecognizer
pour chaque UIImageView. @JeremyPope s 'approche est en fait plus efficace de comparer cette approche.Manipulation
UIButton
est assez simple, sa sous-classe deUIControl
il y a donc des propriétés commehide
etenabled
et vous pouvez manipuler la façon dont vous le souhaitez.Ce que vous devez faire est de créer
UIButton
programmaticly, comme vous vous en créantUIImageView
. La façon de les créer est similaire àUIImageView
, pour en savoir plus sur créer UIButton programmaticly en Swift.L'image ci-dessous est la façon dont un personnalisé
UIButton
ressemble.Laisser des commentaires si vous avez besoin de plus d'infos.
Oui, vous avez raison. C'est mon approche pour résoudre ce problème. Votre approche est certainement plus efficace que la mienne.
OriginalL'auteur Xinyang Li
Par Défaut, l'affichage de l'image d'interaction de l'utilisateur n'est pas activé, alors assurez-vous de l'éteindre.
OriginalL'auteur