2015-03-17 3 views
1

У меня есть TransparentUIView поверх RedOrGreenUIView. TransparentUIView имеет прикрепленный к нему UILongPressGestureRecognizer. После того, как пользователь начинает длинный прикосновение к ней, я проверить .Changed статус этого LongPressGesture и выполнить ниже Трассировка:Swift: hitTest для UIView под другим UIView

var p:CGPoint = rec.locationInView(self.view) 
var selectedView = view.hitTest(p, withEvent: nil) 
if selectedView != nil { 
    if selectedView == TransparentUIView { 
     println("TransparentUIView is being touched") 
    } 
} 

я TransparentView, как selectedView штрафа. Однако мне нужно иметь возможность одновременно совершать хиты в RedOrGreenUIView, что находится под TransparentUIView. Я не могу придумать это. Пожалуйста помоги.

ответ

1

Если один UIView получает касания, другие под ним не получают.

Таким образом, вы можете иметь центральный класс, который передает касания к вашим объектам UIView, или первый UIView, который находится сверху, передает объект UITouch под UIView под ним и проводит hitTest.

+1

В качестве альтернативы, я мог бы предложить использовать метод swizzling, чтобы получить штрихи и размещать их каждый раз е, но пойдем, пока мы не убежим, не так ли? :) –

+0

Мне нравится второй вариант. Будете ли вы любезны рассказать мне, как передать объект UITouch другому виду. Вся помощь, которую я googled, находится в ObjC, который я не понимаю. – Kashif

+0

@TPos В ваших методах реализации UIView коснетсяBegan, touchsMoved и touchesEnded. Это даст вам объект UITouch в этом представлении. Как только вы их получите, вы можете использовать их для своего hitTest или отправить эти объекты под представлениями. Для этого вы пишете функцию в представлении снизу и передаете объект UITouch в качестве параметра. –

7

Создать настраиваемое представление для вашего контейнера и переопределить pointInside: сообщение вернуть NO, если точка не находится в допустимом зрения ребенка, как это:

@interface PassthroughView : UIView 
@end 

@implementation PassthroughView 
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { 
    for (UIView *view in self.subviews) { 
     if (!view.hidden && view.alpha > 0 && view.userInteractionEnabled && [view pointInside:[self convertPoint:point toView:view] withEvent:event]) 
      return YES; 
    } 
    return NO; 
} 
@end 

быстры версия

class PassThroughView: UIView { 

    override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool { 
      for subview in subviews as [UIView] { 
       if !subview.hidden && subview.alpha > 0 && subview.userInteractionEnabled && subview.pointInside(convertPoint(point, toView: subview), withEvent: event) { 
        return true 
       } 
      } 
      return false 
     } 
    } 
+0

Работал для меня, спасибо! – theMouse

+1

В проходе, хотя UIView, есть стекView с кнопками в сетке, промежутки между кнопками - это расстояние между стеке. Интервал stackView не затрагивает вид ниже. Как я могу передать штрихи через интервал стека? – theMouse

+0

Большое вам спасибо. – KSR

0

Swift 4 версия:

override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { 
     for subview in YourView.subviews as [UIView] { 

      if !subview.isHidden && subview.alpha > 0 && subview.isUserInteractionEnabled && subview.point(inside:point, with: event) { 
       return true 
      } 
     } 

    return false 
} 
Смежные вопросы