2010-09-09 16 views
9

W podklasie UIView mam to:iPhone - ustalić, czy doszło w dotyku podrzędny w UIView

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

     return NO; 
    } 

Co mogę umieścić w if? Chcę wykryć, czy w wyglądzie pojawił się dotyk, niezależnie od tego, czy znajduje się on w ramce UIView.

Odpowiedz

2
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { 
    return ([self hitTest:point withEvent:nil] == yourSubclass) 
} 

Sposób - (UIView *) hitTest (CGPoint) punkt withEvent (UIEvent *) zdarzenie zwraca najdalej potomka odbiornik hierarchii widzenia (włącznie), które zawiera się w określonej temperaturze. To, co tam zrobiłem, zwraca wynik porównania najdalszego widoku z twoim podglądem. Jeśli twój podgląd ma również subviews, to może nie działać dla Ciebie. Więc co chcesz zrobić w tym przypadku jest:

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { 
    return ([[self hitTest:point withEvent:nil] isDescendantOfView:yourSubclass]) 
} 
+0

Ale ta metoda jest podklasą UIView, więc to wywala: – sol

+0

Niestety, myślę, że trzeba dodać odpowiedź do wyjaśnienia - patrz poniżej: – sol

0

Ale ta metoda jest w podklasie UIView, więc to wywala:

return ([[self hitTest:point withEvent:nil] isDescendantOfView:self]) 

Przypuszczalnie z powodu nieskończonej rekurencji.

Próbowałem to:

NSSet* touches = [event allTouches]; 
UITouch* touch = [touches anyObject]; 

return ([touch.view isDescendantOfView:self] || touch.view == self); 

Ale zawsze zwraca NO

+0

To działało dla mnie w podklasie UIView: - (void) touchesBegan: (NSSet *) dotyka zEvent: (UIEvent *) event { \t \t UITouch * touch = [dotyka anyObject]; \t jeśli ([touch.view jestDescendantOfView: mySubView]) { \t \t NSLog (@ "YUP"); \t \t} else { \t \t NSLog (@: "nie"); \t} } –

+0

to jednak nie wykrywa dotyku poza kadrem widoku - to najważniejsza część, której szukam. – sol

12

Spróbuj tego:

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

Jeśli chcesz powrócić TAK czy dotyk jest wewnątrz widoku gdzie zaimplementować w tej metodzie użyj tego kodu: (w przypadku, gdy chcesz dodać identyfikatory gestów do wyekspozycji znajdującej się poza zakresem kontenera)

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    if ([super pointInside:point withEvent:event]) 
    { 
     return YES; 
    } 
    else 
    { 
     return CGRectContainsPoint(subview.frame, point); 
    } 
} 
1

TRY TO:

-(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

wersja 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 
    } 
Powiązane problemy