如何在iPhone / iPad / iOS上显示临时弹出消息

时间:2010-09-17 18:22:36

标签: iphone ipad popup alert

我想在iPhone / iPad上显示一条临时消息,显示操作确认或某些背景活动的快速状态。

是否有标准控制来执行此操作?我见过应用程序这样做。圆角矩形,深色和部分透明,内有文字。它不会要求用户输入,但会在很短的时间内自行消失。 Android有一个类似的标准构造。也类似于Growl显示的窗口。

建议表示赞赏。

10 个答案:

答案 0 :(得分: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];

作为一个很好的副作用,当你呈现这个视图时,背景会变暗,你会得到任何警报视图的漂亮摇晃动画。

答案 1 :(得分:15)

cocoacontrols.com上有一个模拟Android风格Toast弹出窗口的用户库。可能就是你要找的东西。

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

还有一个遵循同样的想法。

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

答案 2 :(得分: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];

答案 3 :(得分:8)

我创建了一个Android-Kind Toast,非常简单,因为我现在不需要更多功能。

如果显示它被添加到父视图的底部,那么如果该视图是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

答案 4 :(得分:8)

使用带有nil title和nil按钮的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 dismissWithClickedButtonIndex:0 animated:YES];

您还可以使用新状态即时更改消息:

statusAlert.message = @"Looking up user";

答案 5 :(得分: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]; }];
}

答案 6 :(得分:2)

@ marco-mustapic的类似答案,但没有继承。

- (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上的一个类别或者总是有它的东西。

答案 7 :(得分:2)

* Swift 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)

答案 8 :(得分:2)

这只是 user2234810 2.2版本的 Swift 3版本

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)

答案 9 :(得分:1)

您可以使用我自己的用Swift编写的StatusAlert框架。它使您能够显示类似Apple系统的警报,并在UIView中的任何位置显示相同的警报,而不显示图像,标题或消息。

可通过Cocoapods和Carthage获得,支持iPhone X,安全区域布局,iPad并允许一些自定义。

StatusAlertExample application screenshow