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

时间:2019-02-14 12:17:24

标签: ios uilabel swift4 uitapgesturerecognizer programmatically-created

我正在尝试在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")
}

4 个答案:

答案 0 :(得分:1)

    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

答案 1 :(得分:1)

您做错了几件事...

data.num_frames

如果将标签添加到stackView,则无需设置其框架-让堆栈视图处理该框架。如果您的stackView的对齐方式设置为// your code label.frame.size.width = self.otherlinksStack.bounds.width label.sizeToFit() ,无论如何它将标签拉伸到其宽度。如果未将其设置为,标签将根据其文字水平扩展。因此,也无需调用.fill

.sizeToFit()

将视图添加到堆栈视图时,请使用// your code self.otherlinksStack.addSubview(label) ,否则它将被叠加在堆栈视图中另一个视图之上。

这应该可以正常工作(在我的快速测试中可以做到):

.addArrangedSubview

答案 2 :(得分:0)

如果您的手势可以通过viewDidLoad运行,则从其他函数添加后,该手势可能会被其他控件的手势覆盖。

尝试在与所有其他控件分开的控件上添加手势。

答案 3 :(得分:0)

使用以下代码添加点击手势:

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
}