Я обнаружил, что могу создавать UILabel намного быстрее, чем UITextField, и большую часть времени планирую использовать UILabel для своего приложения для отображения данных.
Короче говоря, я хочу позволить пользователю нажать на UILabel и получить ответ на мой обратный вызов. Это возможно?
Спасибо.
userInteractionEnabled = true
Ответы:
Вы можете добавить
UITapGestureRecognizer
экземпляр в свой UILabel.Например:
UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelTapped)]; tapGestureRecognizer.numberOfTapsRequired = 1; [myLabel addGestureRecognizer:tapGestureRecognizer]; myLabel.userInteractionEnabled = YES;
источник
Если вы используете раскадровки, вы можете выполнить весь этот процесс в раскадровке без дополнительного кода. Добавьте метку к раскадровке, затем добавьте жест касания к метке. На панели "Утилиты" убедитесь, что для метки установлен флажок "Взаимодействие с пользователем включено". С помощью жеста касания (в нижней части контроллера представления на раскадровке) нажмите ctrl + щелкните и перетащите в файл ViewController.h и создайте действие. Затем реализуйте действие в файле ViewController.m.
источник
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 }
источник
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") }
источник
Вместо этого вы можете использовать UIButton и установить желаемый текст. Кнопка не обязательно должна выглядеть как кнопка, если вы не хотите
источник
Чтобы добавить жест касания в 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 { }
Примечание: добавьте UIGestureRecognizerDelegate в файл .h
источник
Быстрая версия:
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:")
источник
Если вы хотите использовать многострочный текст в своей кнопке, создайте
UILabel
многострочный текст и добавьте его в качестве подпредставления на кнопку.например:
yourLabel=[Uilabel alloc]init]; yourLabel.frame=yourButtom.Frame;//(frame size should be equal to your button's frame) [yourButton addSubView:yourLabel]
источник
Swift 3 от Элвина Джорджа
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") }
источник
Версия 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() }
источник
Лично я предпочитаю метод написания расширения для 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 }
Я считаю, что это потенциально может вызвать некоторые утечки памяти, но я еще не определил, как лучше всего их решить.
источник