Подтвердить что ты не робот

Как отображать временное всплывающее сообщение на iPhone/iPad/iOS

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

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

Предложения оценены.

4b9b3361

Ответ 2

Создайте класс, наследующий от 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];

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

Ответ 3

Используйте 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];

Ответ 4

Я создал тост 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

Ответ 5

Используйте UIAlertView с кнопками nil title и nil, а затем, если хотите, отпустите его. Вот как я это сделал:

Создайте переменную экземпляра для представления предупреждения в файле .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";

Ответ 6

В итоге я создал свой собственный класс. Не наследовал от 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]; }];
}

Ответ 7

Подобный ответ на @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 или что-то, что всегда есть.

Ответ 8

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

Ответ 9

Это просто версия 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)

Ответ 10

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

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

StatusAlertExample screen screenshow