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
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]
}
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;
}
}
wo soll ich sagen? und erinnere mich an die meisten der Unteransichten haben ihre eigenen Berührungen umgesetzt. –
direkt halten Sie diese in .m-Datei und ersetzen Sie Ihre Ansicht. – Balu
Entschuldigung zu sagen, dass ich nicht verstehe, was Ihre Idee ist. –
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;
}
- 1. Ansicht entfernen, wenn außerhalb geklopft
- 2. Listener, wenn Ansicht Ansicht Android
- 3. So erkennen Sie, wenn ein Benutzer auf eine Ansicht in Android klickt
- 4. Prevent JQuery Mobil von ein Popup zu schließen, wenn Benutzer außerhalb davon tippt
- 5. Android: Wie erkennt man ein onTouch-Ereignis in einer Ansicht mit einer Berührung außerhalb der Ansicht?
- 6. Label/Schaltfläche ausblenden, wenn sie außerhalb der übergeordneten Ansicht liegt
- 7. Knockout.js Aufrufmethode außerhalb der Ansicht Modell
- 8. Ändern Rasierer Layout außerhalb der Ansicht
- 9. Ansicht springt, wenn Navigationsleiste ausgeblendet
- 10. Swift2: Aktuelle Ansicht Controller beenden und neue Ansicht zeigen Controller
- 11. Benutzer laden Ansicht
- 12. Blaue Markierung über einem ImageView, wenn der Benutzer darauf tippt
- 13. Einführungs-Aktivität, wenn Benutzer auf eine Benachrichtigung vom Lockscreen tippt
- 14. Animieren, wenn Neupositionierung eine Ansicht
- 15. Recycler Ansicht - eine Ansicht öffnet eine andere
- 16. Abbrechen von UISearchBar, wenn der Benutzer auf die Ansicht klickt
- 17. Animieren der Ansicht außerhalb der übergeordneten Layoutgrenzen mit einem CardView
- 18. Eine Ansicht in eine andere Ansicht laden
- 19. Drag & Drop Ansicht außerhalb von Recyclerview
- 20. Wie verwerfen Sie eine UIAlertView, wenn Sie irgendwo außerhalb davon berühren?
- 21. Wie setze ich Informationen in index.html außerhalb der NG-Ansicht?
- 22. Schienen: Render-Ansicht von außerhalb Controller
- 23. UIButton und UILabel nicht aktualisieren von UIButton außerhalb der Ansicht
- 24. Aktualisieren ArrayAdapter einer Ansicht von außerhalb der Fragment-Klasse
- 25. mit django-Autocomplete-Licht außerhalb Admin Ansicht
- 26. jQuery erkennen, ob div ist außerhalb der Ansicht Port vertikal
- 27. Wie kann ich eine Formularinstanz außerhalb einer Ansicht erstellen?
- 28. Zugriff auf die Ansicht außerhalb onCreateView() fehlgeschlagen
- 29. Wie UITapGestureRecognizer für eine untergeordnete Ansicht, die teilweise von der übergeordneten Ansicht abgeschnitten wird, ausgelöst werden?
- 30. Drop-Ansicht, wenn vorhanden
Was ist, wenn wir mit der Ansicht interagieren möchten? – DevilInDisguise