如何使 UILabel 可点击?

Posted

技术标签:

【中文标题】如何使 UILabel 可点击?【英文标题】:How to make a UILabel clickable? 【发布时间】: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 【参考方案1】:

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

【讨论】:

感谢您的回答!!!这里我还有一个关于 UITapGestureRecognizer 的问题:***.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)'

以上是关于如何使 UILabel 可点击?的主要内容,如果未能解决你的问题,请参考以下文章

自动布局约束使 UILabel 对点击更敏感

如何使 UILabel *not* 将触摸传递给它嵌入的 UITableViewCell?

如何制作 URL/电话可点击的 UILabel?

Swift:UILabel 上的 UIButton

如何使整个区域可点击?

如何仅使用情节提要使 UILabel 的 UIView 超级视图适合 UILabel 的固有高度?