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

Posted

技术标签:

【中文标题】以编程方式将点击手势添加到 UILabel【英文标题】:add tap gesture to a UILabel Programmatically 【发布时间】:2019-02-14 12:17:23 【问题描述】:

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

【问题讨论】:

在问题中添加代码 嗯,您是否将userInteractionEnabled 设置为true 是的,我将 userInteractionEnabled 设置为 true。但它不起作用 您需要提供更多信息 - 请参阅 How to Ask 和 minimal reproducible example 请查看问题中的代码。我编辑了它。 【参考方案1】:

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

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

如果您将标签添加到 stackView,则无需设置其框架 - 让 stack view 处理。如果您的 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")

【讨论】:

【参考方案2】:

使用此代码添加点击手势:

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

【讨论】:

【参考方案3】:
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")

然后从viewDidLoad 或从您要添加点击的任何功能调用addTapGesture()

【讨论】:

不,它不工作。我正在以编程方式创建 UILabel 并在从 viewDidLoad 调用的函数中添加点击手势。【参考方案4】:

如果您的手势通过 viewDidLoad 起作用,那么在从其他函数添加之后,手势可能会被其他控件的手势覆盖。..

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

【讨论】:

OP 正在创建标签——它还能分离多少?

以上是关于以编程方式将点击手势添加到 UILabel的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式触发 UIView 的点击手势识别器

以编程方式添加视图和手势 - “发送到实例的无法识别的选择器”

尝试将参数传递给点击手势的方法

在 Swift 中以编程方式启动手势识别器?

UITapGestureRecognizer 在多次点击时崩溃

以编程方式制作的按钮与 viewController 的手势识别器冲突