Як змусити UILabel відповісти на натискання?


94

Я виявив, що можу створити UILabel набагато швидше, ніж UITextField, і я планую використовувати UILabel більшу частину часу для своєї програми відображення даних.

Однак, щоб коротко розповісти, я хочу дозволити користувачеві натиснути на UILabel, і мій зворотний дзвінок відповість на це. Це можливо?

Дякую.


1
Вам потрібно вказатиuserInteractionEnabled = true
onmyway133

Відповіді:


208

Ви можете додати UITapGestureRecognizerекземпляр до вашого UILabel.

Наприклад:

UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelTapped)];
tapGestureRecognizer.numberOfTapsRequired = 1;
[myLabel addGestureRecognizer:tapGestureRecognizer];
myLabel.userInteractionEnabled = YES;

13
Ага, тут властивість 'userInteractionEnabled' є ключовою (оскільки іншу конфігурацію можна і бажано встановлювати в раскадровках). Етикетка за замовчуванням вимикає взаємодію, щоб проходити через дотики через них, але в цьому випадку їм потрібно спостерігати за дотиками, щоб розпізнавач жестів активувався. Дякую!
березень

1
Хороший! Я просто кидав кран на ярлик і зовсім забув увімкнути взаємодію з користувачем. Дякую!
Mike Critchley

37

Якщо ви використовуєте розкадровки, ви можете виконати весь цей процес у розкадровці без додаткового коду. Додайте мітку до розкадрування, а потім додайте до мітки натискання. На панелі «Службові програми» переконайтеся, що для позначення встановлено позначку «Взаємодія з користувачем». З жесту натискання (унизу вашого контролера перегляду на розкадруванні) натисніть Ctrl + клацніть і перетягніть до файлу ViewController.h і створіть дію. Потім реалізуйте дію у файлі ViewController.m.


Метод також доступний лише за допомогою
конструктора

Переконайтеся, що встановлено прапорець «Взаємодія з користувачем увімкнено» у розділі « Перегляд» в інспекторі атрибутів , а не лише в ознаках доступності.
SeanR

17

Свіфт 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
}

Свіфт 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
}

Як отримати текст мітки від об'єкта відправника? Іншими словами, як ідентифікувати відправника?
Vineel

Версія Swift 4 має @selector замість #selector.
Кірбі Тодд,

8

Свіфт 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

Замість цього ви можете скористатися кнопкою UIB та встановити потрібний текст. Кнопка не повинна виглядати як кнопка, якщо ви цього не хочете


1
Щодо цього, у мене завжди були проблеми з багаторядковим текстом, що вирівнює ліворуч. Навіть коли я встановлюю ліве вирівнювання по центру, це все одно трапляється.
Щасливий

Я хоч спробував UIButton, і це дуже приємно. Проблемою є лише багаторядкові кнопки. Дякую.
Щасливий

3

Щоб додати жест натискання на 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


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:")

1

Якщо ви хочете використовувати UILabelбагаторядковий текст у своїй кнопці, створіть багаторядковий текст і додайте як підпрогляд до своєї кнопки.

наприклад:

yourLabel=[Uilabel alloc]init];
yourLabel.frame=yourButtom.Frame;//(frame size should be equal to your button's frame)
[yourButton addSubView:yourLabel]

1

Свіфт 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")
}

0

Свіфт версія виглядає так:

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()
}

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
}

На мою думку, це може призвести до деяких витоків пам'яті, але я ще не визначив, як найкраще їх вирішити.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.