2010-09-17 4 views
30

Ich möchte eine temporäre Nachricht auf dem iPhone/iPad anzeigen, die eine Bestätigung einer Aktion oder einen kurzen Status über einige Hintergrundaktivitäten anzeigt.So zeigen Sie eine temporäre Popup-Nachricht auf dem iPhone/iPad/iOS an

Gibt es eine Standardsteuerung, um dies zu tun? Ich habe Apps dabei gesehen. Ein abgerundetes Rechteck, dunkel und teilweise transparent mit Text im Inneren. Es fragt nicht nach Benutzereingaben, sondern verschwindet in kurzer Zeit von selbst. Android hat ein ähnliches Konstrukt, das Standard ist. Ähnlich wie die von Growl angezeigten Fenster.

Vorschläge geschätzt.

Antwort

15

Es gibt eine Benutzerbibliothek auf kacaconactrols.com, die Toast Pop-ups im Android-Stil emuliert. Könnte sein, wonach Sie suchen.

http://www.cocoacontrols.com/platforms/ios/controls/altoastview

Es gibt auch das eine, die die gleiche Idee folgt.

http://www.cocoacontrols.com/platforms/ios/controls/itoast

+1

Dies ist am nächsten zu dem, was ich suchte, obwohl ich am Ende meine eigene schrieb. – David

+0

Ich fand ALToastView nützlich, danke! –

+1

Update: Die immer populäre [MBProgressHUD] (https://github.com/jdg/MBProgressHUD) hat jetzt eine [Toast-ähnliche Benachrichtigung] (http://dl.dropbox.com/u/378729/MBProgressHUD/7. png). –

9

Verwenden Sie UIAlertView. Hier ist eine schnelle Verbindung zu einem einfachen Beispiel:

UIAlertView

Edited: Sorry, nicht zu verschwinden auf seine eigenen nicht sehen. Ich denke, dass Sie eine Bestätigung von Benutzern der empfangenen Nachrichten benötigen. UIAlertView erreicht das ziemlich genau. Es ist nicht sicher, ob Sie es allmählich verblassen lassen, es sei denn, Sie befinden sich in einer App mit einer Ansicht, die einen Timer oder eine ereignisbasierte Verzögerung aufweist, die eine Ansicht anzeigen und schließlich entfernen.

Zweite Bearbeitung: Es wurde ein Weg gefunden, es zu implementieren. Sie können die Kündigungsfunktion nach einer von Ihnen festgelegten Zeit manuell aufrufen. (Sorry für die unordentlichen post) Es würde wie folgt aussehen:

//Create UIAlertView alert 
alert = [[UIAlertView alloc] initWithTitle:@"Title" message:@"Some message" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles: nil]; 

//After some time 
[alert dismissWithClickedButtonIndex:0 animated:TRUE]; 
+0

Ich habe etwas schnell und schmutzig mit einem UIAlertView ohne Tasten realisiert. Ich verwerfe es nach einer Verzögerung selbst. Es funktioniert, sieht aber nicht annähernd so gut aus wie das, was ich beschrieben habe. Wenn es nicht in die Plattform eingebaut ist, muss es irgendwo eine Implementierung geben. Es scheint nicht zu schwierig zu implementieren, aber es scheint, dass jemand es schon getan haben sollte. Die App 'FeeddlerRSS' verwendet so etwas ständig. – David

+0

Ich habe einen Beitrag für eine andere ähnliche Frage gefunden. Ich denke, das ist mehr, worüber du sprichst: http://stackoverflow.com/questions/593147/how-to-display-a-progress-indicator-overlay-hud-on-iphone – Kennzo

15

Erstellen Sie eine Klasse, die von UIAlertView erbt. Rufen Sie in Ihrem Konstruktor einfach [super init] auf und fügen Sie dann eine beliebige Ansicht als Unteransicht hinzu. Sie können diese Ansicht sogar im Interface Builder entwerfen. Etwas wie folgt aus:

- (id)initWithMessage:(NSString *)message dismissAfter:(NSTimeInterval)interval 
{ 
    if ((self = [super init])) 
    { 
    CustomView * customView = [[[CustomView alloc] init] autorelease]; // or load from NIB 
    [self addSubview:customView]; 
    [self performSelector:@selector(dismissAfterDelay) withObject:nil afterDelay:interval]; 
    } 
    return self; 
} 

- (void)dismissAfterDelay 
{ 
    [self dismissWithClickedButtonIndex:0 animated:YES]; 
} 

Um die benutzerdefinierte Alarmansicht zeigt es nur init, und rufen Sie show wie mit einem normalen UIAlertView.

CustomAlertView * cav = [[CustomAlertView alloc] initWithMessage:@"Doing Something]; 
[cav show]; 
[cav release]; 

Als schöner Nebeneffekt, wenn Sie diese Ansicht präsentieren wird der Hintergrund verdunkeln und Sie werden die schöne wackelig Animation für jede Alarmansicht.

+2

Die UIAlertView-Klasse soll verwendet werden wie es ist und unterstützt keine Unterklassen. Die Ansichtshierarchie für diese Klasse ist privat und darf nicht geändert werden. –

4

ich endete meine eigene Klasse bis zu schaffen. Erbte nicht von UIAlertView. Allgemeine Struktur ist,

-(id)initWithText:(NSString *)msg { 
    // Create a view. Put a label, set the msg 
    CALayer *layer = self.layer; 
    layer.cornerRadius = 8.0f; 
    ... 
    self.backgroundColor = [UIColor colorWithWhite:0 alpha:0.8]; 
    [self performSelector:@selector(dismiss:) withObject:nil afterDelay:2.0]; 
    [self setAutoresizesSubviews:FALSE]; 
    return self; 
} 


- (void)dismiss:(id)sender { 
    // Fade out the message and destroy self 
    [UIView animateWithDuration:0.5 
       animations:^ { self.alpha = 0; } 
       completion:^ (BOOL finished) { [self removeFromSuperview]; }]; 
} 
+0

Beachten Sie, dass Sie "#import " müssen, bevor Sie auf die Eigenschaft cornerRadius des Layers der Ansicht zugreifen können. –

+0

Hey, ich habe diesen Code benutzt. Es funktioniert gut. Aber es lädt nur einmal. Es funktioniert nicht, wenn das Textfeld erneut fokussiert wird. Irgendeine Lösungsmöglichkeit.? –

8

Ich habe einen Android-Kind Toast, ganz einfach, weil ich jetzt in ihm nicht mehr Funktionalität benötigen.

Wenn es angezeigt wird, wird es am unteren Rand der Ansicht des Elternteils hinzugefügt. Wenn diese Ansicht also die VC-Ansicht ist, befindet sie sich in der unteren Mitte des Geräts.

Der Rahmen wird automatisch an die Textlänge angepasst.

Sie verwenden es: [self.view addSubview: [[ToastAlert alloc] initWithText: @"Sent"]];, es wird automatisch entfernt, so dass keine Referenz benötigt wird.

Ich habe dies nicht implementiert, aber Sie können eine statische Methode erstellen, um die Anweisung zu verkürzen und zu verdeutlichen: [ToastAlert showText: @"Sent" inView: self.view];.

Die Klasse:

ToastAlert.h

@interface ToastAlert : UILabel { 

} 

- (id)initWithText: (NSString*) msg; 

@end 

ToastAlert.m

#import "ToastAlert.h" 
#import <QuartzCore/QuartzCore.h> 

@implementation ToastAlert 

#define POPUP_DELAY 1.5 

- (id)initWithText: (NSString*) msg 
{ 

    self = [super init]; 
    if (self) { 

     self.backgroundColor = [UIColor colorWithWhite:0 alpha:0.7]; 
     self.textColor = [UIColor colorWithWhite:1 alpha: 0.95]; 
     self.font = [UIFont fontWithName: @"Helvetica-Bold" size: 13]; 
     self.text = msg; 
     self.numberOfLines = 0; 
     self.textAlignment = UITextAlignmentCenter; 
     self.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; 


    } 
    return self; 
} 

- (void)didMoveToSuperview { 

    UIView* parent = self.superview; 

    if(parent) { 

     CGSize maximumLabelSize = CGSizeMake(300, 200); 
     CGSize expectedLabelSize = [self.text sizeWithFont: self.font constrainedToSize:maximumLabelSize lineBreakMode: NSLineBreakByTruncatingTail]; 

     expectedLabelSize = CGSizeMake(expectedLabelSize.width + 20, expectedLabelSize.height + 10); 

     self.frame = CGRectMake(parent.center.x - expectedLabelSize.width/2, 
           parent.bounds.size.height-expectedLabelSize.height - 10, 
           expectedLabelSize.width, 
           expectedLabelSize.height); 

     CALayer *layer = self.layer; 
     layer.cornerRadius = 4.0f; 

     [self performSelector:@selector(dismiss:) withObject:nil afterDelay:POPUP_DELAY]; 
    } 
} 

- (void)dismiss:(id)sender { 
    // Fade out the message and destroy self 
    [UIView animateWithDuration:0.6 delay:0 options: UIViewAnimationOptionAllowUserInteraction 
        animations:^ { self.alpha = 0; } 
        completion:^ (BOOL finished) { [self removeFromSuperview]; }]; 
} 

@end 
8

Verwenden a UIAlertView mit nil Titel und nil Tasten, es dann entlassen, wenn gewünscht . Hier ist, wie ich das tat:

Erstellen Sie eine Instanz Variable für die Warnungsansicht in Ihrer .h-Datei:

@interface StatusMessageController : UIViewController { 
    UIAlertView *statusAlert; 
} 

In .m-Datei, erstellen Sie eine Methode, um die Alarmansicht zu zeigen und einen Timer zu starten, und eine andere zu behandeln, wenn der Timer abgelaufen ist um die Warnung entlassen:

- (void)showStatus:(NSString *)message timeout:(double)timeout { 
    statusAlert = [[UIAlertView alloc] initWithTitle:nil 
                message:message 
                delegate:nil 
              cancelButtonTitle:nil 
              otherButtonTitles:nil]; 
    [statusAlert show]; 
    [NSTimer scheduledTimerWithTimeInterval:timeout 
            target:self 
            selector:@selector(timerExpired:) 
            userInfo:nil 
            repeats:NO]; 
} 

- (void)timerExpired:(NSTimer *)timer { 
    [statusAlert dismissWithClickedButtonIndex:0 animated:YES]; 
} 

Jedes Mal, wenn Sie die Statusmeldung angezeigt werden soll, rufen sie:

[self showStatus:@"Computing" timeout:4.5]; 

Zu jeder Zeit können Sie auch die Warnung vor entlassen:

statusAlert.message = @"Looking up user"; 
+0

funktioniert perfekt, danke! – marimaf

2

ähnliche Antwort auf @ marco-Mustapic suchen:

[statusAlert dismissWithClickedButtonIndex:0 animated:YES]; 

Sie die Nachricht auch mit neuem Status on-the-fly ändern können , aber ohne Vererbung.

- (void)dismissAlert:(UIAlertView *)alertView 
{ 
    [alertView dismissWithClickedButtonIndex:0 animated:YES]; 
} 

- (void)showPopupWithTitle:(NSString *)title 
        mesage:(NSString *)message 
       dismissAfter:(NSTimeInterval)interval 
{ 
    UIAlertView *alertView = [[UIAlertView alloc] 
      initWithTitle:title 
       message:message 
       delegate:nil 
     cancelButtonTitle:nil 
     otherButtonTitles:nil 
    ]; 
    [alertView show]; 
    [self performSelector:@selector(dismissAlert:) 
       withObject:alertView 
       afterDelay:interval 
    ]; 
} 

es zu benutzen:

[self showPopupWithTitle:@"Hi" message:@"I like pie" dismissAfter:2.0]; 

Werfen Sie es in eine Kategorie auf NSObject oder etwas, das es immer um sich zu haben.

+0

Ich mag das. Genau richtig. –

2

* Swift 2.2 Antwort:

func showPopupWithTitle(title: String, message: String, interval: NSTimeInterval) { 
    let alertController = UIAlertController(title: title, message: message, preferredStyle: .Alert) 
    presentViewController(alertController, animated: true, completion: nil) 
    self.performSelector(#selector(dismissAlertViewController), withObject: alertController, afterDelay: interval) 
} 

func dismissAlertViewController(alertController: UIAlertController) { 
    alertController.dismissViewControllerAnimated(true, completion: nil) 
} 

showPopupWithTitle("Title", message: "Message", interval: 0.5) 
1

Dies ist nur eine Swift 3-Version von user2234810 Version 2.2.

func showPopupWithTitle(title: String, message: String, interval: TimeInterval) { 
    let alertController = UIAlertController(title: title, message: message, preferredStyle: .alert) 
    present(alertController, animated: true, completion: nil) 
    self.perform(#selector(dismissAlertViewController), with: alertController, afterDelay: interval) 
} 

func dismissAlertViewController(alertController: UIAlertController) { 
    alertController.dismiss(animated: true, completion: nil) 
} 
showPopupWithTitle(title: "Title", message: "Message", interval: 0.5) 
0

Sie können meine eigenen StatusAlert Rahmen geschrieben in Swift verwenden. Es gibt Ihnen die Möglichkeit, Apple-System-ähnliche Warnungen sowie die gleiche Warnung ohne Bild, Titel oder Nachricht überall in UIView anzuzeigen.

Es ist verfügbar über Cocoapods und Carthage und unterstützt iPhone X, Safe Areas Layout, iPads und ermöglicht einige Anpassungen.

StatusAlertExample application screenshow

Verwandte Themen