10 Stimmen

IOS Wie man UIAlertView mit einem Fingertipp überall ablehnt?

Ich möchte ein UIAlertView überall außerhalb davon mit einem Fingertipp schließen können. Ich möchte ein UIAlertView ohne irgendwelche Schaltflächen anzeigen.

Ich habe hier Standard-UIAlertView-Codes, aber ich brauche Eingaben dazu, wie ich es schließen kann, wenn das möglich ist.

Mit UITouch? Mit UITapGestureRecognizer?

Vielen Dank.


BEARBEITEN:

in viewDidLoad

Initialisierung des Alert Views hier mit dem Namen "alert"

     if (alert)
     {
    emptyview = [[UIView alloc]initWithFrame:CGRectMake(0,0,320,480)];
    emptyview.backgroundColor = [UIColor clearColor];
    [self.view addSubview:emptyview];
         [emptyview addSubview:alert];
    NSLog (@"emptyview ist da!");

         UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
         [emptyview addGestureRecognizer:singleTap];
         [singleTap release];            
     }

Aber dieses emptyview reagiert überhaupt nicht und es reagiert nicht auf den handleSingleTap-Selektor, den ich etwas geändert habe:

-(void)handleSingleTap:(UITapGestureRecognizer *)sender{
    [alert dismissWithClickedButtonIndex:0 animated:YES];
    [emptyview removeFromSuperview];
}

Ich möchte, dass dieses emptyview über dem Alert angezeigt wird, wenn der Alert angezeigt wird, damit ich den Alert mit einem Fingertipp schließen kann.

Ich habe es versucht:

     if (alert)
     {
    emptyview = [[UIView alloc]initWithFrame:CGRectMake(0,0,320,480)];
    emptyview.backgroundColor = [UIColor clearColor];
    [self.view addSubview:emptyview];
         [emptyview addSubview:alert];
    NSLog (@"emptyview ist da!");

         UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
         [alert addGestureRecognizer:singleTap];
         [singleTap release];            
     }

Natürlich hat der Alert auf die handleSingleTap-Funktion reagiert. Was habe ich bei emptyview falsch gemacht?


ZWEITES BEARBEITEN:

Was ich in diesem Fall erreichen möchte, ist die Anzeige einer kleinen Ansicht mit Erklärungen nach Auswahl eines Wortes, eine ähnliche Funktion in der Kindle-App, falls Sie eine haben. Vielleicht sollte ich eine UIView anstatt eines UIAlertViews erstellen? Aber die kleine Ansicht in der Kindle-App ist so schön mit einem Schatten darunter, wie ist das möglich?

10voto

NJones Punkte 27049

Es scheint, als ob du im Grunde versuchst, ein "Toast" auf iOS nachzubilden. Gute Nachrichten, das hat bereits jemand gemacht. Sieh dir dieses Projekt an.

Bearbeiten: Möchte iToast nicht verwenden. Ich mag deinen Stil, weniger Code ist es. Hier ist, was ich mir überlegt habe. Es scheint offensichtlich zu sein, wie andere gesagt haben, dass der einzige Weg, um die modale Natur des UIAlertView zu überwinden, darin besteht, eine Superview hinzuzufügen, um Touch-Events zu verarbeiten. Aber du musst das nicht jedes Mal manuell tun, erwäge das Untertypen von UIAlertView. Versuche etwas wie das:

Bearbeiten: @wagashi, Danke für die Annahme meiner Antwort, und danke für den Hinweis, dass setFrame: ein guter Ort ist, um die Größe anzupassen. Dein Code erzeugt tatsächlich ein sehr toastähnliches kleines Alert, aber als ich es versuchte, fand ich heraus, dass wenn die Nachricht zu lang war, schien die Ansicht auseinanderzufallen. Also habe ich setFrame: geändert, um einfach die Größe des Alerts um etwa die Größe eines Buttons zu reduzieren und zentriert auf dem Bildschirm zu bleiben. So beantwortet die Klasse genau die Frage "iOS Wie man UIAlertView mit einem Tap überall entlässt?"

NoButtonAlertView.h

#import 
@interface _NoButtonAlertViewCover : UIView
@property (nonatomic,assign) UIAlertView *delegate;
@end
@interface NoButtonAlertView : UIAlertView
-(id)initWithTitle:(NSString *)title message:(NSString *)message;
@end

NoButtonAlertView.m

#import "NoButtonAlertView.h"
@implementation _NoButtonAlertViewCover
@synthesize delegate = _delegate;
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    [self removeFromSuperview];
    [_delegate dismissWithClickedButtonIndex:0 animated:YES];
}
@end
@implementation NoButtonAlertView
-(void)show{
    [super show];
    _NoButtonAlertViewCover *cover = [[_NoButtonAlertViewCover alloc] initWithFrame:[UIScreen mainScreen].bounds];
    cover.userInteractionEnabled = YES;
    cover.backgroundColor = [[UIColor lightGrayColor] colorWithAlphaComponent:.01];
    cover.delegate = self;
    [self.superview addSubview:cover];
}
-(id)initWithTitle:(NSString *)title message:(NSString *)message{
    if ((self = [super initWithTitle:title message:message delegate:nil cancelButtonTitle:nil otherButtonTitles:nil, nil])){
    }
    return self;
}
- (void)setFrame:(CGRect)rect {
    // Wird mehrmals aufgerufen, 4 dieser Male zählen, daher Höhe um 40 reduzieren
    rect.size.height -= 10;
    self.center = self.superview.center;
    [super setFrame:rect];
}
@end

Mit diesem einfachen UIAlertView Untertyp und seinem UIView Untertyp für ein Cover kannst du es genauso einfach verwenden wie einen Standard UIAlertView. So:

NoButtonAlertView *alert = [[NoButtonAlertView alloc] initWithTitle:@"Hallo" message="Ich bin das vollkommene Modell eines modernen Generals; Ich bin Information, Gemüse, Tier und Mineralien."];
[alert show];

Wird ergeben:

Benutzerdefinierter AlertView

3voto

beryllium Punkte 29485

Nach Anzeige des UIAlertViews fügen Sie Ihrem ViewController (oder sogar dem Fenster) eine neue leere UIView mit voller Bildschirmgröße hinzu. Fügen Sie dieser Ansicht einen UITapGestureRecognizer hinzu

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
[view addGestureRecognizer:singleTap];
[singleTap release];

Jetzt können Sie in der Methode handleSingleTap den UIAlertView schließen und diese Ansicht aus dem Fenster entfernen

-(void)handleSingleTap:(UITapGestureRecognizer *)sender{
    [myAlert dismissWithClickedButtonIndex:0 animated:YES];
    [view removeFromSuperview];
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X