Обробка сенсорної події в 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.