Обробка сенсорної події в UILabel та підключення її до IBAction


101

Гаразд, у мене є UILabelстворений в інтерфейсі конструктор, який відображає деякий текст за замовчуванням "натисніть, щоб почати".

Коли користувач натискає кнопку UILabelЯ хочу, щоб він запустив метод IBAction: -(IBAction)next;який оновлює текст на етикетці, щоб сказати щось нове.
Було б дуже зручно, якби це дозволило мені просто перетягнути з'єднання з мого методу на мітку, а потім вибрати сенсорну панель всередині, як за допомогою кнопки. але на жаль, сигари немає.

так що в будь-якому випадку, я думаю, моє запитання полягає в тому, чи потрібно мені підклас, UILabelщоб це працювало? Або є якийсь спосіб перетягнути кнопку над міткою, але зробити її 0% непрозорою. Або є більш просте рішення, якого я відсутній?

Відповіді:


255

Перевір:

UILabel *label = ...
label.userInteractionEnabled = YES;
UITapGestureRecognizer *tapGesture =
      [[UITapGestureRecognizer alloc] initWithTarget:self 
                                              action:@selector(labelTap)];
[label addGestureRecognizer:tapGesture];

Трюк полягає в тому, щоб увімкнути взаємодію користувачів.


1
Що робити, якщо у мене є кілька міток? як я можу розрізнити, який з них був натиснутий?
учень

1
@learner спробуйте властивість тегу. обов'язково використовуйте labelTap: замість labelTap. та використання - (недійсна) labelTap: (id) відправник ;.
thedjaney

1
@thedjaney Відправник - це UITapGestureRecognizer, а не UILabel
h4labs

TapGestureRecognizer - це не те, що підключення всередину, і втрачає відповідність та доступність людського інтерфейсу.

1
@ h4labs ви можете використовувати UITapGestureRecognizer * tapGesture = відправник; потім отримайте мітку з міткою tapGesture.view.tag
DJTano

70

UILabel успадковує від UIView, який успадковує від UIResponder. Усі об'єкти UIresponder можуть обробляти події, що торкаються. Так у файлі вашого класу, який знає про ваш погляд (який містить UIlabel), реалізуйте:

-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event;

В конструкторі інтерфейсів встановити значення тегу UILabel. коли у вашому методі touchesBegan трапляються дотики, перевірте значення тега подання, до якого належить тег:

UITouch *touch = [touches anyObject];

if(touch.view.tag == MY_TAG_VAL)
label.text = @"new text";

Ви з'єднуєте свій код у файлі класу з об'єктом UILabel в конструкторі інтерфейсів, оголошуючи змінну примірника UILabel за допомогою префікса IBOutlet:

IBOutlet UILabel *label;

Тоді в програмі інтерфейсів ви можете їх з'єднати.


31
Одне зауваження, ви повинні переконатися, що ви встановили прапорець "Взаємодія користувачів увімкнено" у програмі для створення інтерфейсу, інакше це не працюватиме.
midas06

Я зачепив одну проблему цим методом. Це справно працювало, коли контролер перегляду завантажувався безпосередньо, але коли я створив контролер навігації, натиснув контролер, що містить мітку, до контролера наві, а потім відобразив його, дотики, схоже, більше не дістаються до мітки. Будь-які ідеї?
midas06

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

5
Аналогічний метод, який не вимагає тегів, - це просто перевірити, чи touch.view дорівнює розетці, яку ви встановили для етикетки. Я вважаю за краще це, оскільки це означає, що я не повинен слідкувати за тегами.
Розморожено

чудове рішення. Я рекомендую не встановлювати жоден тег як 0, оскільки натискання будь-якого місця має значення тега 0. Це тому, що у вашому представленні буде, швидше за все, значення тега 0. Інакше ви можете встановити тег вашого перегляду на щось на кшталт -1, і тоді ви можете використовувати значення тега 0 десь ще, тобто кнопку
kevinl

30

Ви можете використовувати UIButton, зробити його прозорим, тобто спеціальний тип без зображення, і додати на нього UILabel (по центру). Потім підключіть звичайні події кнопки.


Я погоджуюся, що користувацький тип кнопки повинен надавати вам досвід користувачеві типу UILabel.
stitz

2
+1, приємно і просто. Я раніше це пробував, встановивши звичайну кнопку на opactiy 0, яка не працювала, але порада змінити тип на звичайну працювала чудово.
Брайан Москау

Непрозорість вплине на кнопку та всі її підгляди, тому непрозорість = 0 зробить всю річ невидимою.
Ейко

10
Yikes. Це злом порівняно з іншими рішеннями в цій темі. Використовуйте розпізнавальник жестів дотику на етикетці, якщо ви хочете розпізнати жест натискання на етикетці. (Подивіться, як це звучить так, як це було призначено для цього?)
Джеймс Батчер

Це набагато краще рішення, оскільки кнопки керують сенсорною панеллю, а не просто натисканням (початок).

17

Швидкий 3

У вас є IBOutlet

@IBOutlet var label: UILabel!

У якому ви вмикаєте взаємодію з користувачем та додаєте розпізнавальник жестів

label.isUserInteractionEnabled = true
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(userDidTapLabel(tapGestureRecognizer:)))
label.addGestureRecognizer(tapGesture)

І, нарешті, обробіть кран

func userDidTapLabel(tapGestureRecognizer: UITapGestureRecognizer) {
  // Your code goes here
}

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