我发现我可以比UITextField更快地创建UILabel,并且我计划在大多数时间使用UILabel来处理我的数据显示应用程序。
总而言之,我希望让用户点击UILabel并让我的回调响应。这可能吗?
感谢。
答案 0 :(得分:203)
您可以向UILabel添加UITapGestureRecognizer
实例。
例如:
UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelTapped)];
tapGestureRecognizer.numberOfTapsRequired = 1;
[myLabel addGestureRecognizer:tapGestureRecognizer];
myLabel.userInteractionEnabled = YES;
答案 1 :(得分:36)
如果您正在使用故事板,则可以在故事板中执行此整个过程而无需其他代码。在故事板上添加标签,然后在标签上添加一个点击手势。在“实用工具”窗格中,确保"启用用户交互"检查标签。从点击手势(在故事板中视图控制器的底部),按住Ctrl键并单击并拖动到ViewController.h文件并创建一个Action。然后在ViewController.m文件中实现该操作。
答案 2 :(得分:13)
Swift 3.0
初始化tempLabel
tempLabel?.text = "Label"
let tapAction = UITapGestureRecognizer(target: self, action: #selector(self.actionTapped(_:)))
tempLabel?.isUserInteractionEnabled = true
tempLabel?.addGestureRecognizer(tapAction)
动作接收器
func actionTapped(_ sender: UITapGestureRecognizer) {
// code here
}
Swift 4.0
初始化tempLabel
tempLabel?.text = "Label"
let tapAction = UITapGestureRecognizer(target: self, action:@selector(actionTapped(_:)))
tempLabel?.isUserInteractionEnabled = true
tempLabel?.addGestureRecognizer(tapAction)
动作接收器
func actionTapped(_ sender: UITapGestureRecognizer) {
// code here
}
答案 3 :(得分:8)
Swift 2.0:
我正在添加一个nsmutable字符串作为sampleLabel的文本,启用用户交互,添加点击手势并触发方法。
override func viewDidLoad() {
super.viewDidLoad()
let newsString: NSMutableAttributedString = NSMutableAttributedString(string: "Tap here to read the latest Football News.")
newsString.addAttributes([NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleDouble.rawValue], range: NSMakeRange(4, 4))
sampleLabel.attributedText = newsString.copy() as? NSAttributedString
let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "tapResponse:")
tapGesture.numberOfTapsRequired = 1
sampleLabel.userInteractionEnabled = true
sampleLabel.addGestureRecognizer(tapGesture)
}
func tapResponse(recognizer: UITapGestureRecognizer) {
print("tap")
}
答案 4 :(得分:4)
您可以改用UIButton并将文本设置为您想要的内容。如果您不想
,按钮不必看起来像按钮答案 5 :(得分:2)
在UILable上添加点按手势
UITapGestureRecognizer *tapAction = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(lblClick:)];
tapAction.delegate =self;
tapAction.numberOfTapsRequired = 1;
//Enable the lable UserIntraction
lblAction.userInteractionEnabled = YES;
[lblAction addGestureRecognizer:tapAction];
并评估选择方法
- (void)lblClick:(UITapGestureRecognizer *)tapGesture {
}
注意:在.h文件中添加UIGestureRecognizerDelegate
答案 6 :(得分:2)
Swift版本:
var tapGesture : UITapGestureRecognizer = UITapGestureRecognizer()
然后在viewDidLoad()
内添加:
let yourLbl=UILabel(frame: CGRectMake(x,y,width,height)) as UILabel!
yourLbl.text = "SignUp"
tapGesture.numberOfTapsRequired = 1
yourLbl.addGestureRecognizer(tapGesture)
yourLbl.userInteractionEnabled = true
tapGesture.addTarget(self, action: "yourLblTapped:")
答案 7 :(得分:1)
如果您想在按钮中使用多行文字,请创建一个带有多行文字的UILabel
,并将其作为子视图添加到您的按钮中。
例如:
yourLabel=[Uilabel alloc]init];
yourLabel.frame=yourButtom.Frame;//(frame size should be equal to your button's frame)
[yourButton addSubView:yourLabel]
答案 8 :(得分:1)
override func viewDidLoad() {
super.viewDidLoad()
let newsString: NSMutableAttributedString = NSMutableAttributedString(string: "Tap here to read the latest Football News.")
newsString.addAttributes([NSUnderlineStyleAttributeName: NSUnderlineStyle.styleDouble.rawValue], range: NSMakeRange(4, 4))
sampleLabel.attributedText = newsString.copy() as? NSAttributedString
let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(ViewController.tapResponse))
tapGesture.numberOfTapsRequired = 1
sampleLabel.isUserInteractionEnabled = true
sampleLabel.addGestureRecognizer(tapGesture)
}
func tapResponse(recognizer: UITapGestureRecognizer) {
print("tap")
}
答案 9 :(得分:0)
Swift版看起来像这样:
func addGestureRecognizerLabel(){
//Create a instance, in this case I used UITapGestureRecognizer,
//in the docs you can see all kinds of gestures
let gestureRecognizer = UITapGestureRecognizer()
//Gesture configuration
gestureRecognizer.numberOfTapsRequired = 1
gestureRecognizer.numberOfTouchesRequired = 1
/*Add the target (You can use UITapGestureRecognizer's init() for this)
This method receives two arguments, a target(in this case is my ViewController)
and the callback, or function that you want to invoke when the user tap it view)*/
gestureRecognizer.addTarget(self, action: "showDatePicker")
//Add this gesture to your view, and "turn on" user interaction
dateLabel.addGestureRecognizer(gestureRecognizer)
dateLabel.userInteractionEnabled = true
}
//How you can see, this function is my "callback"
func showDatePicker(){
//Your code here
print("Hi, was clicked")
}
//To end just invoke to addGestureRecognizerLabel() when
//your viewDidLoad() method is called
override func viewDidLoad() {
super.viewDidLoad()
addGestureRecognizerLabel()
}
答案 10 :(得分:0)
我个人更喜欢为UILabel编写扩展的方法。这就是我用的。
import UIKit
extension UILabel {
/**
* A map of actions, mapped as [ instanceIdentifier : action ].
*/
private static var _tapHandlers = [String:(()->Void)]()
/**
* Retrieve the address for this UILabel as a String.
*/
private func getAddressAsString() -> String {
let addr = Unmanaged.passUnretained(self).toOpaque()
return "\(addr)"
}
/**
* Set the on tapped event for the label
*/
func setOnTapped(_ handler: @escaping (()->Void)) {
UILabel._tapHandlers[getAddressAsString()] = handler
let gr = UITapGestureRecognizer(target: self, action: #selector(onTapped))
gr.numberOfTapsRequired = 1
self.addGestureRecognizer(gr)
self.isUserInteractionEnabled = true
}
/**
* Handle the tap event.
*/
@objc private func onTapped() {
UILabel._tapHandlers[self.getAddressAsString()]?()
}
}
然后,您可以在任何UILabel实例中使用它:
myLabel.setOnTapped {
// do something
}
我相信这可能会导致一些内存泄漏,但是我还没有确定如何最好地解决它们。
答案 11 :(得分:0)
这在 Xcode 12和Swift 5
中效果很好let tapAction = UITapGestureRecognizer(target: self,action:#selector(actionTapped(_:)))
userLabel?.isUserInteractionEnabled = true
userLabel?.addGestureRecognizer(tapAction)
以及类似-
的动作方法@objc func actionTapped(_ sender: UITapGestureRecognizer) {
print("tapped")
}