iphone - определить, произошло ли касание в подпредставлении uiview - PullRequest
9 голосов
/ 09 сентября 2010

В подклассе UIView у меня есть это:

    -(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
    {
       if(touch occurred in a subview){
         return YES;
       }

       return NO;
    }

Что я могу добавить в утверждение if? Я хочу определить, произошло ли касание в подпредставлении, независимо от того, находится ли оно в рамке UIView.

Ответы [ 4 ]

12 голосов
/ 13 сентября 2011

Попробуйте это:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    return CGRectContainsPoint(subview.frame, point);
}

Если вы хотите вернуть YES, если касание находится внутри представления, где вы реализуете этот метод, используйте этот код: (в случае, если вы хотите добавить распознаватели жестов в подпредставление, расположенное за пределами границ контейнера)

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    if ([super pointInside:point withEvent:event])
    {
        return YES;
    }
    else
    {
        return CGRectContainsPoint(subview.frame, point);
    }
}
2 голосов
/ 09 сентября 2010
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
   return ([self hitTest:point withEvent:nil] == yourSubclass)
}

Метод - (UIView *) hitTest: (CGPoint) point withEvent: (UIEvent *) событие возвращает самого дальнего потомка получателя в иерархии представления (включая самого себя), который содержит указанную точку. Что я там сделал, так это вернул результат сравнения самого дальнего обзора с вашим подпредставлением. Если ваше подпредставление также имеет подпредставления, это может не сработать для вас. Итак, что вы хотели бы сделать в этом случае:

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
   return ([[self hitTest:point withEvent:nil] isDescendantOfView:yourSubclass])
}
1 голос
/ 09 апреля 2013

ПОПРОБУЙТЕ:

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
   NSSet *touches = [event allTouches];
   UITouch *touch = [touches anyObject];
   if([touch.view isKindOfClass:[self class]]) {
   return YES;
   }
   return NO;
}
0 голосов
/ 28 марта 2016

Swift версия:

  var yourSubview: UIView!

  override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool {
    return subviewAtPoint(point) == yourSubview 
  }

  private func subviewAtPoint(point: CGPoint) -> UIView? {
    for subview in subviews {
      let view = subview.hitTest(point, withEvent: nil)
      if view != nil {
        return view
      }
    }
    return nil
  }
...