Как отобразить временное всплывающее сообщение на iPhone / iPad / iOS - PullRequest
30 голосов
/ 17 сентября 2010

Я хотел бы отобразить временное сообщение на iPhone / iPad, отображающее подтверждение действия или какой-либо быстрый статус о фоновой активности.

Существует ли стандартный элемент управления для этого? Я видел, как приложения делают это. Прямоугольник с закругленными углами, темный и частично прозрачный с текстом внутри. Он не запрашивает пользовательский ввод, но исчезает сам по себе в течение короткого периода времени. Android имеет аналогичную конструкцию, которая является стандартной. Также похоже на окна, отображаемые Growl.

Предложения приветствуются.

Ответы [ 10 ]

16 голосов
/ 20 августа 2011

На сайте cocoacontrols.com есть пользовательская библиотека, которая эмулирует всплывающие окна в стиле Android.Может быть, то, что вы ищете.

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

Есть также тот, который следует той же идее.

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

15 голосов
/ 18 сентября 2010

Создайте класс, который наследуется от UIAlertView. В вашем конструкторе просто вызовите [super init] и затем добавьте любое представление, которое вы хотите, как подпредставление. Вы даже можете создать этот вид в Интерфейсном Разработчике. Примерно так:

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

В качестве приятного побочного эффекта, когда вы представляете этот вид, фон потемнеет, и вы получите хорошую шаткую анимацию для любого вида оповещения.

9 голосов
/ 17 сентября 2010

Используйте UIAlertView. Вот быстрая ссылка на простой пример:

UIAlertView

Отредактировано: извините, не видел исчезновения сам по себе. Я думаю, что вам нужно иметь некоторое подтверждение от пользователей полученных сообщений. UIAlertView в значительной степени выполняет это. Не уверен, что он постепенно исчезает, если только вы не находитесь в приложении с представлением, в котором есть таймер или задержка на основе событий, которая будет отображать представление, а затем в конечном итоге удалить его.

Второе редактирование: нашел способ реализовать это. Вы можете вручную вызвать функцию dismiss через определенное время, которое вы определили. (Извините за грязный пост) Это будет выглядеть примерно так:

//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];
8 голосов
/ 24 марта 2014

Используйте 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";
8 голосов
/ 16 января 2013

Я создал тост Android-Kind, довольно простой, потому что мне сейчас не нужно больше функциональности.

Когда он отображается, он добавляется в нижней части родительского вида, поэтому, если этот вид является видом 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 голосов
/ 23 ноября 2011

Я закончил тем, что создал свой собственный класс.Не наследуется от 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]; }];
}
2 голосов
/ 22 марта 2017

Это просто версия Swift 3 из user2234810 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)
2 голосов
/ 04 ноября 2016

* 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)
2 голосов
/ 18 апреля 2014

Подобный ответ на @ marco-mustapic's, но без наследования.

- (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 или что-то, чтобы всегда иметь это.

1 голос
/ 17 декабря 2017

Вы можете использовать мой собственный StatusAlert каркас, написанный на Swift.Это дает вам возможность показывать системное предупреждение Apple, а также представлять такое же предупреждение без изображения, заголовка или сообщения в любом месте в UIView.

. Оно доступно через Cocoapods и Carthage и поддерживает iPhone X, SafeРасположение областей, iPad и позволяет некоторые настройки.

StatusAlertExample application screenshow

...