Как добавить сенсорное событие в UIView?
Я пытаюсь:
UIView *headerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, nextY)] autorelease];
[headerView addTarget:self action:@selector(myEvent:) forControlEvents:UIControlEventTouchDown];
// ERROR MESSAGE: UIView may not respond to '-addTarget:action:forControlEvents:'
Я не хочу создавать подкласс и перезаписать
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
Ответы:
В iOS 3.2 и выше вы можете использовать распознаватели жестов. Например, вот как вы бы обработали событие касания:
Есть также множество встроенных жестов. Проверьте документы для обработки событий iOS и
UIGestureRecognizer
. У меня также есть куча примеров кода на github, которые могут помочь.источник
CGPoint
представляет местоположение касания в суперпредставлении повернутого вида. Вы можете использовать эту точку, чтобы переместить повернутый вид (или родственный вид) в повернутое местоположение. Это более полезно в обработчикеUIPanGestureRecognizer
для перетаскивания вида по экрану.Распознаватели жестов
Существует ряд часто используемых сенсорных событий (или жестов), о которых вы можете получать уведомления, когда добавляете в свое представление Gesture Recognizer . Следующие типы жестов поддерживаются по умолчанию:
UITapGestureRecognizer
Нажмите (короткое касание экрана один или несколько раз)UILongPressGestureRecognizer
Долгое касание (касание экрана долгое время)UIPanGestureRecognizer
Пан (перемещая палец по экрану)UISwipeGestureRecognizer
Проведите (быстро двигая пальцем)UIPinchGestureRecognizer
Щепотка (перемещение двух пальцев вместе или врозь - обычно для увеличения)UIRotationGestureRecognizer
Поворот (перемещение двух пальцев по кругу)В дополнение к этому вы также можете сделать свой собственный распознаватель жестов.
Добавление жеста в Интерфейсном Разработчике
Перетащите распознаватель жестов из библиотеки объектов на ваше представление.
Управляйте перетаскиванием из жеста в Схеме документа в свой код View Controller, чтобы создать Outlet и Action.
Это должно быть установлено по умолчанию, но также убедитесь, что User Action Enabled имеет значение true для вашего представления.
Добавление жеста программно
Чтобы добавить жест программно, вы (1) создаете распознаватель жестов, (2) добавляете его в представление и (3) создаете метод, который вызывается при распознавании жеста.
Ноты
sender
Параметр является необязательным. Если вам не нужна ссылка на этот жест, вы можете не указывать его. Однако, если вы это сделаете, удалите(sender:)
имя метода после действия.handleTap
метода было произвольным. Назовите это как хотите .action: #selector(someMethodName(sender:))
Больше примеров
Вы можете изучить средства распознавания жестов, которые я добавил к этим представлениям, чтобы увидеть, как они работают.
Вот код для этого проекта:
Ноты
источник
UIView
вас необходимо также добавить:self.isUserInteractionEnabled = true;
Я думаю, что вы можете просто использовать
я имею в виду headerView распространяется от UIControl.
источник
UITapGestureRecognizer
это не заменаUIControlEventTouchDown
. АTap
обычно состоит изUIControlEventTouchDown
иUIControlEventTouchUpInside
.UIView
не являетсяUIControl
и, следовательно, не имеет доступа кaddTarget:action:forControlEvents:
.Свифт 3 и Свифт 4
использование
источник
На основании принятого ответа вы можете определить макрос:
Этот макрос использует ARC, поэтому нет
release
вызова.Пример использования макроса:
источник
Вы можете достичь этого, добавив Gesture Recogniser в ваш код.
Шаг 1: ViewController.m:
Шаг 2: ViewController.m:
ПРИМЕЧАНИЕ: здесь yourView в моем случае был
@property (strong, nonatomic) IBOutlet UIView *localView;
РЕДАКТИРОВАТЬ: * localView - это белая рамка в Main.storyboard снизу
источник
В Swift 4.2 и Xcode 10
Используйте UITapGestureRecognizer для добавления сенсорного события
Если вы хотите использовать SharedClass
У меня есть 3 представления в моем ViewController, называемые view1, view2 и view3.
источник
Вот версия Swift:
источник
BlockTap
?Свифт 3:
источник
Кажется довольно простым в эти дни. Это версия Swift.
источник
Вот это IOS Tapgesture; Сначала вам нужно создать действие для GestureRecognizer после написания кода ниже под действием, как показано ниже
источник
Другой способ - добавить прозрачную кнопку в представление.
А затем обработайте щелчок:
источник
Создайте распознаватель жестов (подкласс), который будет реализовывать сенсорные события, например
touchesBegan
. Вы можете добавить его в представление после этого.Таким образом, вы будете использовать состав вместо подклассов (который был запросом).
источник
Почему бы вам не попробовать SSEventListener ?
Вам не нужно создавать какой-либо распознаватель жестов и отделять свою логику от другого метода.
SSEventListener
поддерживает настройку блоков слушателя в представлении для прослушивания жеста одним касанием, жеста двойного касания и жеста N-касания, а также жеста длительного нажатия. Установка прослушивателя с одним касанием становится следующим образом:[view ss_addTapViewEventListener:^(UITapGestureRecognizer *recognizer) { ... } numberOfTapsRequired:1];
источник
Objective-C:
Swift:
Вопрос задает:
Это не просит события касания .
Конкретно ОП хочет реализовать
UIControlEventTouchDown
Переключение
UIView
наUIControl
правильный ответ здесь , потому чтоGesture Recognisers
ничего не знает о.touchDown
,.touchUpInside
, и.touchUpOutside
т.д.Кроме того, UIControl наследуется от UIView, поэтому вы не теряете никакой функциональности.
Если все, что вам нужно, это касание, то вы можете использовать Gesture Recogniser. Но если вам нужен более точный контроль, как требует этот вопрос, вам понадобится UIControl.
https://developer.apple.com/documentation/uikit/uicontrol?language=objc https://developer.apple.com/documentation/uikit/uigesturerecognizer?language=objc
источник