Обнаружить, если некоторые UIView были затронуты среди других UIView


28

У меня есть 3 UIViews, наложенных поверх одного большого uiview. Я хочу знать, затрагивает ли пользователь верхнюю и не заботится о других. У меня будет несколько кнопок во втором UIView и UITable в третьем UIView.

Проблема заключается в том, что я включаю userInteractionEngabled на первом представлении, и это работает, но все другие представления отвечают одинаково, даже если я отключу его. Если я отключу userInteractionEnabled на self.view, никто из них не ответит. Я также не могу определить, какой вид был затронут в методе делегатов touchhesBegan.

Мой код:

UIView *aView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 150)]; 
aView = userInteractionEnabled = YES; 
[self.view addSubview:aView]; 

UIView *bView = [[UIView alloc] initWithFrame:CGRectMake(0, 150, 320, 50)]; 
bView.userInteractionEnabled = NO; 
[self.view addSubview:bView]; 

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
//This gets called for a touch anywhere 
} 
58

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

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event; 

В вашей пользовательской реализации touchsBegan проверьте каждое касание в наборах. Точка для метода Трассировки может быть получена с помощью

- (CGPoint)locationInView:(UIView *)view; 

метода, где вид на вашем SuperView (тот, который содержит другие мнения).

EDIT: Вот быстрый заказ реализация:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    CGPoint locationPoint = [[touches anyObject] locationInView:self]; 
    UIView* viewYouWishToObtain = [self hitTest:locationPoint withEvent:event]; 
} 

Я надеюсь, что это было полезно, Пол

  0

Извините, я знаю, что вы на правильном пути, но я немного затрудняюсь понять, что вы говорите. Я получаю то, что касается касания от вашего местоположенияInView, и я мог бы технически разработать, с какого пользователя пользователь коснулся этого, но я не уверен, как он называет hitTest 08 май. 102010-05-08 08:33:21

+2

Следует отметить, что вызов 'locationInView:' с параметром ' nil' дает вам местоположение 'CGPoint' в координатном пространстве главного окна. 13 мар. 122012-03-13 00:48:39


26

В моем случае UIView я хотел найти не был возвращен в Трассировка. Но следующий код работал лучше:

CGPoint locationPoint = [[touches anyObject] locationInView:self.view]; 
    CGPoint viewPoint = [myImage convertPoint:locationPoint fromView:self.view]; 
    if ([myImage pointInside:viewPoint withEvent:event]) { 
     do something 
    } 
  0

Я также столкнулся с проблемами с принятым ответом. По какой-то причине это сработало. Обратите внимание, что я также пытался обнаружить хиты в UIImageView, а не только UIView, если это вообще актуально. 22 июн. 142014-06-22 23:36:25


8

В touchesBegan проверить, что прикоснулся вид является тот, который вы хотите, решить эту проблему для меня, когда я пытался отождествляются, если пользователь прикоснулся к конкретной ImageView.

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

    if ([touch view] == imageView) { 
     ... your code to handle the touch 
    } 
    ... 

Если настроить контент для просмотра diamensions убедитесь, чтобы изменить размер представления соответственно в противном случае он будет распознавать сенсорное событие, даже в области, где в так содержании в представлении. В моем случае, когда я попытался сохранить пропорцию изображения с UIViewContentModeScaleAspectFit, хотя изображение было отрегулировано по мере необходимости в областях с «пробелами», также попадало событие касания.


12

Это также можно сделать следующим образом.

Сначала найдите местоположение прикосновения в представлении вы заботитесь о:

CGPoint location = [touches.anyObject locationInView:viewYouCareAbout]; 

Тогда см, если точка находится в пределах зрения:

BOOL withinBounds = CGRectContainsPoint(viewYouCareAbout.bounds, location); 

Тогда, если оно находится в пределах границ , выполните свое действие.

Это может быть сделано с помощью одного оператора, который, например, может быть использован непосредственно в пределах, если заявление:

CGRectContainsPoint(viewYouCareAbout.bounds, [touches.anyObject locationInView:viewYouCareAbout]) 

8

быстры код:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     if let touch = touches.first { 
      if touch.view == self.view { 
       self.hideInView() 
      } else { 
       return 
      } 

     } 
    } 
  0

отличный ответ для быстрого. Разделяйте любовь с голосом. 07 июл. 162016-07-07 16:06:59


0

Это работает для меня:

func respondToGesture(gesture: UIGestureRecognizer) { 
    let containsPoint = CGRectContainsPoint(targetView.bounds, gesture.locationInView(targetView)) 
}