Сенсорное событие на UIView - PullRequest
30 голосов
/ 09 ноября 2010

Есть ли у кого-нибудь пример кода для обнаружения касаний в динамически создаваемом UIView?Я нашел некоторые ссылки на touchesBegan, но не могу понять, как это реализовать ...

Ответы [ 6 ]

82 голосов
/ 09 ноября 2010

Очень общий способ получить прикосновения - переопределить эти методы в пользовательском подклассе UIView:

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

Официальные документы для этих методов находятся в Ответ на события касания в класс UIResponder docs (UIView наследует эти методы, так как это подкласс UIResponder).Более длинные и более вводные документы можно найти в Руководстве по обработке событий для iOS .

Если вы просто хотите обнаружить касание (касание, затем касание в вашем представлении),проще всего добавить UIButton в качестве подпредставления вашего представления и добавить собственный настраиваемый метод в качестве пары цели / действия для этой кнопки.Пользовательские кнопки по умолчанию невидимы, поэтому они не влияют на внешний вид.

Если вы ищете более продвинутые взаимодействия, также полезно знать о классе UIGestureRecognizer .

16 голосов
/ 20 февраля 2012

Создание события касания с UIAnimation на UIView, вы можете управлять касаниями на UIView где угодно.

Следующий код: здесь self.finalScore - это UIView, а cup - это UIImageView. Я справляюсь

событие касания в UIImageView, оно присутствует внутри UIView.

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

UITouch *touch1 = [touches anyObject];
CGPoint touchLocation = [touch1 locationInView:self.finalScore];
CGRect startRect = [[[cup layer] presentationLayer] frame];
CGRectContainsPoint(startRect, touchLocation);

[UIView animateWithDuration:0.7 
                      delay:0.0 
                    options:UIViewAnimationCurveEaseOut 
                 animations:^{cup.transform = CGAffineTransformMakeScale(1.25, 0.75);} 
                 completion:^(BOOL finished) {  
                     [UIView animateWithDuration:2.0 
                                           delay:2.0 
                                         options:0
                                      animations:^{cup.alpha = 0.0;} 
                                      completion:^(BOOL finished) {
                                          [cup removeFromSuperview];
                                          cup = nil;}];                 
                 }];

}

Как и UITapGestureRecognizer, это еще один способ обработки сенсорных событий в UIView ....

UITapGestureRecognizer *touchOnView = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(releaseButAction)] autorelease];

// Set required taps and number of touches
[touchOnView setNumberOfTapsRequired:1];
[touchOnView setNumberOfTouchesRequired:1];

// Add the gesture to the view
[[self view] addGestureRecognizer:touchOnView];
4 голосов
/ 09 ноября 2010

Создайте свой собственный пользовательский UIView из созданного вами подкласса, унаследовав UIView, и переопределите следующий метод внутри подкласса,

(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

}
3 голосов
/ 10 ноября 2016

С recongnizer гостя, очень легко поймать сенсорные события.

Найдите один из компонентов в библиотеке раскадровок:

enter image description here

Например, перетащите Tap Gesture Recognizer на ваш вид. Это не отображается в пользовательском интерфейсе представления. Вы можете найти его в схеме документа на левой панели раскадровки:

enter image description here

Последний шаг - связать его (путем перетаскивания элемента управления) с представлением в качестве делегата, где отслеживается касание, и перетащить элемент управления в класс контроллера представления в качестве действия. Вот изображение ссылки соединения.

enter image description here

и код действия:

@IBAction func tapAction(_ sender: Any) {
    // touch is captured here.
}
2 голосов
/ 04 июня 2015

Вместо захвата касания с помощью жеста я бы предложил изменить родительский класс UIView на UIControl, чтобы он мог обрабатывать событие touchUpInside

От:

@interface MyView : UIView

Кому:

@interface MyView : UIControl

и затем добавьте эту строку для просмотра-

    [self addTarget:self action:@selector(viewTapped:) forControlEvents:UIControlEventTouchUpInside]; 

Поскольку жест может создать проблему при прокрутке.

1 голос
/ 13 апреля 2016

Мой метод состоит в том, чтобы просто изменить класс UIView на UIControl в InterfaceBuilder IdentityInspector, после чего ConnectionsInspector немедленно получит событие касания, готовое к подключению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...