如何使 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 '(() -> Void)'
。以上是关于如何使 UILabel 可点击?的主要内容,如果未能解决你的问题,请参考以下文章