2010-09-17 85 views
30

我想在iPhone/iPad上顯示一條臨時消息,顯示操作確認或有關某些後臺活動的快速狀態。如何在iPhone/iPad/iOS上顯示臨時彈出消息

有沒有一個標準的控制來做到這一點?我見過應用程序這樣做。一個圓角矩形,黑色,部分透明,裏面有文字。它不要求用戶輸入,而是在短時間內自行消失。 Android有一個類似的標準構造。也類似於咆哮顯示的窗口。

建議感激。

回答

15

cocoacontrols.com上有一個模擬Android風格Toast彈出窗口的用戶庫。可能是你在找什麼。

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

還有這一個遵循同樣的想法。

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

+1

這與我所尋找的最接近,但我最終寫了自己的。 – David 2011-11-26 01:42:32

+0

我發現ALToastView有用,謝謝! – 2012-01-12 05:47:03

+1

更新:不斷流行的[MBProgressHUD](https://github.com/jdg/MBProgressHUD)現在有[Toast-like通知](http://dl.dropbox.com/u/378729/MBProgressHUD/7。 PNG)。 – 2012-08-07 21:59:38

9

使用UIAlertView。這裏有一個快速鏈接到一個簡單的例子:

UIAlertView

編輯:對不起,沒看到消失在它自己的。我認爲你需要得到用戶收到的消息的確認。 UIAlertView幾乎可以做到這一點。不知道你是否已經逐漸消失,除非你在一個具有計時器或基於事件延遲的視圖的應用程序中顯示一個視圖,然後最終刪除它。

第二次編輯:找到了實現它的方法。您可以在指定的一段設定時間後手動調用解除功能。 (對不起,凌亂後)這將是這個樣子:

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

我使用不帶按鈕的UIAlertView中實現的東西快速和骯髒。我拖延後自己解僱了。它有效,但看起來沒有我所描述的那麼好。如果它沒有內置到平臺中,那麼必須有某個實現。似乎不是很難自己實現,但似乎有人應該已經做到了。應用程序「FeeddlerRSS」不斷地使用它。 – David 2010-09-17 18:38:38

+0

我發現了另一個類似問題的帖子。我認爲這更多的是你在說什麼:http://stackoverflow.com/questions/593147/how-to-display-a-progress-indicator-overlay-hud-on-iphone – Kennzo 2010-09-17 18:56:28

15

創建從UIAlertView繼承的類。在你的構造函數中調用[super init]然後添加你想要的任何視圖作爲子視圖。你甚至可以在Interface Builder中設計這個視圖。事情是這樣的:

- (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]; 
} 

要顯示自定義警報視圖只是初始化它,並調用show與常規UIAlertView

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

作爲一個很好的副作用,當你提出這個觀點的背景會變暗,你會得到漂亮的不穩定動畫任何警報視圖。

+2

UIAlertView類旨在按原樣使用,不支持子類化。該類的視圖層次結構是私有的,不能修改。 – 2013-05-29 18:14:32

4

我結束了創建我自己的類。沒有從UIAlertView繼承。一般結構是,

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

請注意,您必須先'#import '才能訪問視圖圖層的cornerRadius屬性。 – 2011-11-28 17:40:58

+0

嘿,我已經使用這段代碼。 它的工作正常。但它只加載一次。當文本字段重新聚焦時它不起作用。任何解決方案。? – 2012-05-16 09:26:11

8

我創建一個Android類麪包,很簡單,因爲我不現在它需要更多的功能。

當顯示它被添加到父視圖的底部時,所以如果該視圖是VC的視圖,那麼它將位於設備的底部中心。

該幀被自動調整爲文本長度。

您使用它:[self.view addSubview: [[ToastAlert alloc] initWithText: @"Sent"]];,它將被自動刪除,因此不需要參考。

我還沒有實現這個,但你可以創建一個靜態方法來縮短和澄清指令,排序:[ToastAlert showText: @"Sent" inView: self.view];

類:

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

使用帶有零標題和零按鈕的UIAlertView中,然後在需要時清除它。以下是我這樣做:

在.h文件中創建警報視圖的實例變量:

@interface StatusMessageController : UIViewController { 
    UIAlertView *statusAlert; 
} 

在您.m文件,創建一個方法來顯示警報視圖,並啓動一個定時器,當計時器到期解除警報另一個處理:每當你想顯示狀態信息

- (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]; 
} 

,調用它:

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

在任何時候,你也可以關閉與警報:

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

完美地工作,謝謝! – marimaf 2014-07-11 23:50:20

2

類似的答案@馬爾科 - mustapic的:

[statusAlert dismissWithClickedButtonIndex:0 animated:YES]; 

您也可以更改消息與新的狀態上的飛,但沒有繼承。

- (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 
    ]; 
} 

要使用它:

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

扔到上NSObject的類別或東西總是有它周圍。

+0

我喜歡這個。正好。 – 2015-12-03 18:42:22

2

*雨燕2.2答:

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

這僅僅是一個斯威夫特3user2234810 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

你可以用我自己的StatusAlert框架寫成Swift。它使您能夠顯示類似Apple系統的警報,並在UIView的任何地方提供沒有圖像,標題或消息的相同警報。

它可通過Cocoapods和Carthage獲得並支持iPhone X,安全區域佈局,iPad和允許一些自定義設置。

StatusAlertExample application screenshow