以编程方式将点击手势添加到 UILabel

Abd*_*yum 4 uilabel ios uitapgesturerecognizer programmatically-created swift4

我试图在 swift 4 的函数中为动态创建的 UILabel 添加点击手势,但它没有触发 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")
}
Run Code Online (Sandbox Code Playgroud)

Don*_*Mag 5

你做错了几件事......

// your code
label.frame.size.width = self.otherlinksStack.bounds.width
label.sizeToFit()
Run Code Online (Sandbox Code Playgroud)

如果要将标签添加到 stackView,则无需设置其框架 - 让 stack 视图处理它。如果您的 stackView 的对齐设置为.fill它,无论如何都会将标签拉伸到其宽度。如果未设置为填充,标签将根据其文本根据需要水平扩展。所以,也不需要打电话.sizeToFit()

// your code
self.otherlinksStack.addSubview(label)
Run Code Online (Sandbox Code Playgroud)

将视图添加到堆栈视图时,请使用.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")
}
Run Code Online (Sandbox Code Playgroud)