2013-04-16 2 views
7

Ich habe eine sehr komplexe App mit vielen gestapelten Ansichten, die viele Schaltflächen, Zeichnungsbereiche und andere benutzerdefinierte Touch-Funktionen enthalten. Ich zeige eine ziehbare Helferansicht an, die über allen anderen Ansichten sein kann. Ich muss diese Ansicht ablehnen, wenn der Benutzer irgendwo außerhalb der Hilfsansicht tippt. Ich habe versucht, mehrere UIWindows zu verwenden und Gesture recognizers dem UIWindow hinzuzufügen.Eine Ansicht beenden, wenn ein Benutzer irgendwo außerhalb der Ansicht tippt

Antwort

14

Ein einfach ist, eine transparente Schaltfläche hinzufügen, die gleich begrenzt ist Grenzen ist der Superview. Und die Superview fügen Sie die transparente Schaltfläche unterhalb Ihrer Hilfsansicht ein.

Die transparente Schaltfläche fügt ein Klickereignis hinzu, mit dem die Hilfsansicht und die transparente Schaltfläche selbst ausgeblendet werden können.

Zum Beispiel:

UIButton *transparencyButton = [[UIButton alloc] initWithFrame:superview.bounds]; 
transparencyButton.backgroundColor = [UIColor clearColor]; 
[superview insertSubview:transparencyButton belowSubview:helperView]; 
[transparencyButton addTarget:self action:@selector(dismissHelper:) forControlEvents:UIControlEventTouchUpInside]; 

und die dismissHelper: Methode kann dies tun:

- (void)dismissHelper:(UIButton *)sender 
{ 
    [helperView dismiss]; 
    sender.hidden = YES; 
    // or [sender removeFromSuperview] 
} 
+2

Was ist, wenn wir mit der Ansicht interagieren möchten? – DevilInDisguise

8

Sie können die berührte Ansicht überprüfen, indem Sie die Berührungen durchgehen und die .view-Eigenschaft der Berührung betrachten. Es spiegelt die Sichtweise wider, woher die Sicht tatsächlich stammt.

Unter der Annahme, dass Sie einen Verweis auf Ihre Ansicht (entweder über ein IBOutlet oder anders) zu Ihrer Ansicht namens "myView" behalten, funktioniert das unten.

In Ihrer .m-Datei. Die touchesBegan: Funktion wird jedes Mal ausgelöst, wenn der Benutzer einen Finger berührt. Wir durchlaufen die Berührungen, um zu sehen, ob die ursprüngliche Ansicht der Berührung NICHT gleich "myView" ist. Dieser Vergleich kann auch durch Überprüfen der Klasse, des Tags oder einer anderen Eigenschaft, die Sie zum Identifizieren Ihrer Ansicht verwenden, erfolgen. Beispiele unten angegeben.

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    NSLog(@"touches began"); 
    UITouch *touch = [touches anyObject]; 
    if(touch.view!=myView){ 
     myView.hidden = YES; 
    } 
} 

oder im Falle eines Tags verwenden:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    NSLog(@"touches began"); 
    UITouch *touch = [touches anyObject]; 
    if(touch.view.tag!=23){ 
     myView.hidden = YES; 
    } 
} 
+0

wo soll ich sagen? und erinnere mich an die meisten der Unteransichten haben ihre eigenen Berührungen umgesetzt. –

+0

direkt halten Sie diese in .m-Datei und ersetzen Sie Ihre Ansicht. – Balu

+0

Entschuldigung zu sagen, dass ich nicht verstehe, was Ihre Idee ist. –

1

eine hittestintercept Ansicht erstellen. Dadurch kann die Ansicht unten Ereignisse wie zuvor behandeln.

@protocol HitTestInterceptViewDelegate <NSObject> 

- (BOOL)interceptHitTest:(CGPoint)point withEvent:(UIEvent *)event; 

@end 

@interface HitTestInterceptView : UIView 

@property(nonatomic, weak) id<HitTestInterceptViewDelegate> hitTestInterceptDelegate; 

@end 

HtiTestInterceptView.m

import "HitTestInterceptView.h"

@implementation HitTestInterceptView 

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 
    if ([_hitTestInterceptDelegate interceptHitTest:point withEvent:event] == NO) { 
     return [super hitTest:point withEvent:event]; 
    } 
    return nil; 
} 

@end 

dann in der Ansicht Toast verwenden

- (void)dismissIfTouchOutsideInView:(UIView *)view { 
    if (_interceptView != nil) return; 
    _interceptView = [[HitTestInterceptView alloc] initWithFrame:view.bounds]; 
    _interceptView.backgroundColor = [UIColor clearColor]; 
    _interceptView.hitTestInterceptDelegate = self; 
    [view insertSubview:_interceptView belowSubview:self]; 
} 

- (BOOL)interceptHitTest:(CGPoint)point withEvent:(UIEvent *)event { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // [self dismiss]; 
    }); 
    return YES; 
} 
Verwandte Themen