2010-09-09 8 views
9

In einer Unterklasse von UIView Ich habe dies:iphone - festzustellen, ob Note in subview einen uiview aufgetreten

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

     return NO; 
    } 

Was kann ich in der if-Anweisung setzen? Ich möchte feststellen, ob in einer Unteransicht eine Berührung aufgetreten ist, unabhängig davon, ob sie innerhalb des Rahmens der UIView liegt oder nicht.

Antwort

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

Verfahren - (UIView *) hitTest: (CGPoint) Punkt withevent: (UIEvent *) Ereignis gibt den fernsten Abkömmling des Empfängers in der Ansichtshierarchie (einschließlich sich selbst), die einen festgelegten Punkt beinhaltet. Was ich dort gemacht habe, ist das Ergebnis des Vergleichs der weitesten Ansicht mit Ihrer Unteransicht. Wenn Ihre Unteransicht auch Unteransichten enthält, funktioniert dies möglicherweise nicht für Sie. Also, was Sie wollen in diesem Fall zu tun ist:

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

Aber diese Methode ist eine Unterklasse von UIView, so dass diese Abstürze: – sol

+0

sorry, ich glaube, ich brauche eine Antwort hinzuzufügen, zu erklären, siehe unten – sol

0

Aber diese Methode ist in einer Unterklasse von UIView, so dass diese Abstürze:

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

Vermutlich wegen der unendlichen Rekursion.

Ich versuchte dies:

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

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

Aber es gibt immer NO

+0

Dies funktioniert für mich in einer UIView Unterklasse -: - (void) touchesBegan: (NSSet *) berührt Withevent: (UIEvent *) Ereignis { \t \t UITouch * touch = [berührt anyObject]; \t if ([touch.view istDescendantOfView: mySubView]] { \t \t NSLog (@ "YUP"); \t} \t sonst { \t \t NSLog (@ "NOPE"); \t} } –

+0

dies erkennt jedoch keine Berührungen außerhalb des Rahmens der Ansicht - das ist der wichtigste Teil, den ich suche. – sol

12

bereites:

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

Wenn Sie JA, wenn die Berührung innerhalb der Ansicht zurückkehren möchten, können Sie implementieren Verwenden Sie diesen Code: (Wenn Sie Gestenerkenner zu einer Unteransicht hinzufügen möchten, die sich außerhalb der Grenzen des Containers befindet)

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

TRY THIS:

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

Swift Version:

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 
    }