0
votes

Ajouter un geste de robinet à un Uilabel par programme

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")
}


13 commentaires

Ajouter du code à la question


Eh bien, avez-vous défini userInterActionAcéder à à true ?


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 Interaction utilisateur Enbeled Votre étiquette doit prendre le robinet


@Sandepbhandari Oui, mais ça ne fonctionne pas pour moi.


@ABDULQAYYUM - IS AutreLinkSstack A uistackview ?


@Donmag Oui, c'est un uistackview


@ABDULQAYYUM - Est-ce que votre alignement défini sur défini sur remplir ?


@ABDULQAYYYUM - En fait, alignement n'a pas d'importance. Voir ma réponse.


4 Réponses :


0
votes

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.

Essayez d'ajouter un geste sur le contrôle qui se sépare de tous les autres contrôles.


1 commentaires

L'OP est Création de l'étiquette - Combien plus séparé peut-il être?



1
votes
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.

1 commentaires

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.



1
votes

Utilisez ce code pour ajouter le geste du robinet:

@objc func tapGestureMethod(_ gesture: UITapGestureRecognizer) {
    Do your code here
}


0 commentaires

1
votes

Vous faites quelques choses mal ... xxx pré>

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 .fill code> Il étirera l'étiquette à sa largeur de toute façon. Si c'est non strong> défini à remplir, l'étiquette se développera horizontalement au besoin, en fonction de son texte. Ainsi, non besoin d'appeler .sizefit () code>. P> xxx pré>

Lorsque vous ajoutez une vue sur une vue sur la pile, utilisez .Addarrangedsubview code>, sinon il sera ajouté superposé sur une autre vue dans la vue de la pile. p>

Cela devrait fonctionner correctement (il fait dans mon test rapide): 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")
}


0 commentaires