J'essaie d'ajouter un geste de robinet pour un Uilabel créé de manière dynamique dans une fonction de Swift 4, mais il ne tire pas la fonction UITAPGestReCognizer. Il fonctionne lorsque j'ajoute un geste de robinet à partir de la fonction ViewDidLoad, mais je dois ajouter un geste de robinet à partir d'une autre fonction.
Voici le code P>
override func viewDidLoad() { super.viewDidLoad() createLabel() } func createLabel() { let label = UILabel() label.text = "abc" label.numberOfLines = 0 label.frame.size.width = self.otherlinksStack.bounds.width label.font = label.font.withSize(17) // my UIFont extension label.sizeToFit() label.tag = 1 self.otherlinksStack.addSubview(label) let labelTapGesture = UITapGestureRecognizer(target:self,action:#selector(self.doSomethingOnTap)) label.isUserInteractionEnabled = true label.addGestureRecognizer(labelTapGesture) } @objc func doSomethingOnTap() { print("tapped") }
4 Réponses :
Si votre geste fonctionne de la vueDiDload, puis après avoir ajouté d'une autre fonction, le geste peut remplacer par les gestes de l'autre contrôle. P>
Essayez d'ajouter un geste sur le contrôle qui se sépare de tous les autres contrôles. P>
L'OP est Création de i> l'étiquette - Combien plus séparé peut-il être?
func addTapGesture() { let labelTapGesture = UITapGestureRecognizer(target: self, action: #selector(doSomethingOnTap)) //Add this line to enable user interaction on your label myLabel.isUserInteractionEnabled = true myLabel.addGestureRecognizer(labelTapGesture) } @objc func doSomethingOnTap() { print("tapped") } Then call addTapGesture() from viewDidLoad or from whichever function you wanna add tap from.
Non, ça ne fonctionne pas. Je crée Uilabel par programme et ajouter du geste de robinet avec une fonction appelée à partir de ViewDidLoad.
Utilisez ce code pour ajouter le geste du robinet:
@objc func tapGestureMethod(_ gesture: UITapGestureRecognizer) { Do your code here }
Vous faites quelques choses mal ... Si vous ajoutez l'étiquette à une StackView, il n'est pas nécessaire de définir son cadre - Laissez la vue de la pile gérer cela. Si votre alignement de StackView est défini sur Lorsque vous ajoutez une vue sur une vue sur la pile, utilisez Cela devrait fonctionner correctement (il fait dans mon test rapide): P> .fill code> Il étirera l'étiquette à sa largeur de toute façon. Si c'est
.sizefit () code>. P>
.Addarrangedsubview code>, sinon il sera ajouté superposé sur une autre vue dans la vue de la pile. p>
func createLabel() {
let label = UILabel()
label.text = "abc"
label.numberOfLines = 0
label.font = label.font.withSize(17) // my UIFont extension
label.tag = 1
// give the label a background color so we can see it
label.backgroundColor = .cyan
// enable user interaction on the label
label.isUserInteractionEnabled = true
// add the label as an Arranged Subview to the stack view
self.otherlinksStack.addArrangedSubview(label)
// create the gesture recognizer
let labelTapGesture = UITapGestureRecognizer(target:self,action:#selector(self.doSomethingOnTap))
// add it to the label
label.addGestureRecognizer(labelTapGesture)
}
@objc func doSomethingOnTap() {
print("tapped")
}
Ajouter du code à la question
Eh bien, avez-vous défini
userInterActionAcéder à code> à
true code>?
Oui, je définit UserPortAcédentEnabled to true. mais ça ne fonctionne pas
Vous devez fournir beaucoup plus d'informations - voir Comment demander et Exemple reproductible minimal
S'il vous plaît voir le code dans la question. Je l'ai édité.
L'interaction utilisateur est-elle activée sur votre autre kinkinkstack?
AutreLinkKinkstack est un UISTACKView et son interaction utilisateur est activé.
@ abdul-qayyum: si vous avez votre
uistackview code> Interaction utilisateur Enbeled Votre étiquette doit prendre le robinet
@Sandepbhandari Oui, mais ça ne fonctionne pas pour moi.
@ABDULQAYYUM - IS
AutreLinkSstack Code> A
uistackview code>?
@Donmag Oui, c'est un uistackview
@ABDULQAYYUM - Est-ce que votre alignement code> défini sur
défini sur
remplir code>?
@ABDULQAYYYUM - En fait,
alignement code> n'a pas d'importance. Voir ma réponse.