добавить жест касания к UILabel программно - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь добавить жест касания для динамически создаваемой UILabel в функцию в swift 4, но она не запускает функцию UITapGestureRecognizer.он работает, когда я добавляю жест касания из функции viewDidLoad, но мне нужно добавить жест касания из другой функции.

вот код

    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 ]

0 голосов
/ 14 февраля 2019

Вы делаете пару вещей неправильно ...

// your code
label.frame.size.width = self.otherlinksStack.bounds.width
label.sizeToFit()

Если вы добавляете метку в stackView, нет необходимости устанавливать его фрейм - пусть стековое представление обрабатывает это,Если выравнивание вашего stackView установлено на .fill, оно все равно будет растягивать метку до ее ширины.Если для не установлено заполнение, метка будет расширяться по мере необходимости по горизонтали, основываясь на ее тексте.Поэтому также не нужно вызывать .sizeToFit().

// your code
self.otherlinksStack.addSubview(label)

. При добавлении представления в представление стека используйте .addArrangedSubview, в противном случае оно будет добавлено поверх другого представления в представлении стека..

Это должно работать нормально (в моем быстром тесте):

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 голосов
/ 14 февраля 2019
    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")
    }

Затем позвоните addTapGesture() с viewDidLoad или с любой функции, с которой вы хотите добавить сигнал.

0 голосов
/ 14 февраля 2019

Используйте этот код для добавления жеста касания:

let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(tapGestureMethod(_:)))
tapGesture.numberOfTapsRequired = 1
tapGesture.numberOfTouchesRequired = 1
yourLabel.isUserInteractionEnabled = true
yourLabel.addGestureRecognizer(tapGesture)

Это метод жеста касания:

@objc func tapGestureMethod(_ gesture: UITapGestureRecognizer) {
    Do your code here
}
0 голосов
/ 14 февраля 2019

Если ваш жест работает из viewDidLoad, то после добавления из другой функции этот жест может быть переопределен жестами другого элемента управления.

Попробуйте добавить жест в элемент управления, который отделен от всех других элементов управления.

...