【问题标题】:How to make a UILabel clickable?如何使 UILabel 可点击?
【发布时间】:2016-02-13 00:21:05
【问题描述】:

我想让 UILabel 可点击。

这个我试过了,还是不行:

class DetailViewController: UIViewController {

    @IBOutlet weak var tripDetails: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        ...
        let tap = UITapGestureRecognizer(target: self, action: Selector("tapFunction:"))
        tripDetails.addGestureRecognizer(tap)
    }

    func tapFunction(sender:UITapGestureRecognizer) {
        print("tap working")
    }
}

【问题讨论】:

  • 你的UILabel的框架是什么?你确定你触摸的是标签的框架吗?你有 UIViews 覆盖标签吗?标签的userInteractionEnabled 是否设置为True
  • 确保您的 UILabel IBOutlet 已连接到您的 Nib 或 Storyboard

标签: ios swift uilabel uitapgesturerecognizer


【解决方案1】:

您是否尝试在tripDetails 标签上将isUserInteractionEnabled 设置为true?这应该可以。

【讨论】:

  • 感谢您的回答!!!这里我还有一个关于 UITapGestureRecognizer 的问题:stackoverflow.com/questions/33659078/…
  • 我正在尝试更改点击时的背景颜色,但是当我松开手指时点击事件正在触发。有没有办法赶上着陆事件?长按不是我想要的。
  • 哦,哇,所以默认情况下标签不是用户可交互的,感谢它!
【解决方案2】:

Swift 3 更新

替换

Selector("tapFunction:")

#selector(DetailViewController.tapFunction)

例子:

class DetailViewController: UIViewController {

    @IBOutlet weak var tripDetails: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        ...

        let tap = UITapGestureRecognizer(target: self, action: #selector(DetailViewController.tapFunction))
        tripDetails.isUserInteractionEnabled = true
        tripDetails.addGestureRecognizer(tap)
    }

    @objc
    func tapFunction(sender:UITapGestureRecognizer) {
        print("tap working")
    }
}

【讨论】:

  • 我不得不用@objc注释点击功能。
【解决方案3】:

SWIFT 4 更新

 @IBOutlet weak var tripDetails: UILabel!

 override func viewDidLoad() {
    super.viewDidLoad()

    let tap = UITapGestureRecognizer(target: self, action: #selector(GameViewController.tapFunction))
    tripDetails.isUserInteractionEnabled = true
    tripDetails.addGestureRecognizer(tap)
}

@objc func tapFunction(sender:UITapGestureRecognizer) {

    print("tap working")
}

【讨论】:

    【解决方案4】:

    斯威夫特 5

    类似于@liorco,但需要将@objc替换为@IBAction

    class DetailViewController: UIViewController {
    
        @IBOutlet weak var tripDetails: UILabel!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            ...
    
            let tap = UITapGestureRecognizer(target: self, action: #selector(DetailViewController.tapFunction))
            tripDetails.isUserInteractionEnabled = true
            tripDetails.addGestureRecognizer(tap)
        }
    
        @IBAction func tapFunction(sender: UITapGestureRecognizer) {
            print("tap working")
        }
    }
    

    这适用于 Xcode 10.2。

    【讨论】:

    • @IBAction 只需要将方法暴露给 Xcode 的 Interface Builder(因此是 IB)。它也充当@objc,但如果您使用代码添加手势或其他操作,则应使用@objc 注释
    【解决方案5】:

    Swift 3 更新

    yourLabel.isUserInteractionEnabled = true
    

    【讨论】:

    • 这对我没有帮助。我正在尝试在表格视图中的标签上执行此操作
    • 让它在这里也能正常工作,即使它已经在情节提要中设置了。
    【解决方案6】:

    又好又方便的解决方案:

    在您的视图控制器中:

    @IBOutlet weak var label: LabelButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        self.label.onClick = {
            // TODO
        }
    }
    

    您可以将它放在您的 ViewController 或另一个 .swift 文件中(例如 CustomView.swift):

    @IBDesignable class LabelButton: UILabel {
        var onClick: () -> Void = {}
        override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
            onClick()
        }
    }
    

    在情节提要中选择标签,然后在字段类的“身份检查器”的右侧窗格中选择标签按钮。

    别忘了在标签属性检查器中启用“用户交互已启用”

    【讨论】:

    • 在viewDidLoad()里面如果不起作用需要添加这一行:self.label.isUserInteractionEnabled = true
    【解决方案7】:

    您需要启用该标签的用户交互.....

    例如

    yourLabel.userInteractionEnabled = true

    【讨论】:

    • 这对我没有帮助。我正在尝试在表格视图中的标签上执行此操作
    【解决方案8】:

    对于 swift 3.0 还可以更改手势长按持续时间

    label.isUserInteractionEnabled = true
    let longPress:UILongPressGestureRecognizer = UILongPressGestureRecognizer.init(target: self, action: #selector(userDragged(gesture:))) 
    longPress.minimumPressDuration = 0.2
    label.addGestureRecognizer(longPress)
    

    【讨论】:

      【解决方案9】:

      像我一样很容易被忽略,但不要忘记使用UITapGestureRecognizer 而不是UIGestureRecognizer

      【讨论】:

        【解决方案10】:

        谢谢researcher

        这是我使用 UIKit 编程用户界面的解决方案。

        我只在 Swift 5 上尝试过。它奏效了。

        有趣的事实是您不必明确设置isUserInteractionEnabled = true

        import UIKit
        
        open class LabelButon: UILabel {
            var onClick: () -> Void = {}
            
            public override init(frame: CGRect) {
                super.init(frame: frame)
                isUserInteractionEnabled = true
            }
            
            public required init?(coder: NSCoder) {
                super.init(coder: coder)
            }
            
            public convenience init() {
                self.init(frame: .zero)
            }
            
            open override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
                onClick()
            }
        }
        

        用途:

        override func viewDidLoad() {
            super.viewDidLoad()
            
            let label = LabelButton()
            label.text = "Label"
            label.onClick = {
                // TODO
            }
        }
        

        不要忘记设置约束。否则它不会出现在视图中。

        【讨论】:

          【解决方案11】:

          如上述解决方案所述 您应该首先启用用户交互并添加点击手势

          此代码已经过测试

          Swift4 - Xcode 9.2

          yourlabel.isUserInteractionEnabled = true
          yourlabel.addGestureRecognizer(UITapGestureRecognizer(){
                          //TODO 
                      })
          

          【讨论】:

          • 当我尝试这个时我得到Cannot invoke initializer for type 'UITapGestureRecognizer' with an argument list of type '(() -&gt; Void)'
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-27
          • 2011-06-23
          • 2011-11-01
          • 1970-01-01
          相关资源
          最近更新 更多