web-dev-qa-db-fra.com

Android Toast équivalent sur iOS

Est-ce que quelqu'un sait ce que l'équivalent Java Toast de cet événement Objective C d'iOS serait dans un fragment? Ce que je recherche pour la même alerte en Java en utilisant un Toast à la place du iOS UIAlert. Je suis désolé de ne pas l'avoir précisé dans mon message d'origine.

- (void) dateLogic {
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"MMMM dd"];
    NSString *theDate = [dateFormat stringFromDate:[NSDate date]];

    //JANUARY
    if ([theDate isEqualToString:@"January 01"]) {

        feastDay = [[UIAlertView alloc]
                     initWithTitle:@"New Years Day!"
                     message:@"January 01"
                     delegate:self
                     cancelButtonTitle:nil
                     otherButtonTitles:@"Close", nil];
        feastDay.delegate = self;
        [feastDay show];
    }
}
25
Bil Kimes

J'ai trouvé cette classe incroyable dans github qui fonctionne comme un charme . Toast pour iOS Il suffit d'importer les fichiers UIView + Toast.h et UIView + Toast.m, puis d'ajouter 

[self.view makeToast:@"This is a piece of toast."];

comme écrit dans les exemples de page.

28
Lucia Belardinelli

Je l'ai traité avec une méthode d'assistance d'interface utilisateur statique simple à l'aide de la fenêtre de clé:

+(void)displayToastWithMessage:(NSString *)toastMessage
{
    [[NSOperationQueue mainQueue] addOperationWithBlock:^ {
        UIWindow * keyWindow = [[UIApplication sharedApplication] keyWindow];
        UILabel *toastView = [[UILabel alloc] init];
        toastView.text = toastMessage;
        toastView.font = [MYUIStyles getToastHeaderFont];
        toastView.textColor = [MYUIStyles getToastTextColor];
        toastView.backgroundColor = [[MYUIStyles getToastBackgroundColor] colorWithAlphaComponent:0.9];
        toastView.textAlignment = NSTextAlignmentCenter;
        toastView.frame = CGRectMake(0.0, 0.0, keyWindow.frame.size.width/2.0, 100.0);
        toastView.layer.cornerRadius = 10;
        toastView.layer.masksToBounds = YES;
        toastView.center = keyWindow.center;

        [keyWindow addSubview:toastView];

        [UIView animateWithDuration: 3.0f
                          delay: 0.0
                        options: UIViewAnimationOptionCurveEaseOut
                     animations: ^{
                         toastView.alpha = 0.0;
                     }
                     completion: ^(BOOL finished) {
                         [toastView removeFromSuperview];
                     }
         ];
    }];
}
11
wboland

Il n’existe pas d’équivalent Android pour les toasts sous iOS.

Mais il y a toujours des solutions de contournement comme 

vous pouvez animer une vue et jouer avec son alpha 

Ce qui suit est juste un exemple de code, pas une solution

UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:3.0f];
imageView.alpha = 0.0f;
[UIView commitAnimations];

si vous ne voulez pas disparaître en moins de 3 secondes, vous pouvez utiliser

[UIView setAnimationDelay:3];

et réduire la durée d'animation à 0.5f ou quelque chose. Je pense qu'en utilisant un court temps de fondu, on se sent mieux que de simplement mettre cache

11
Vivo

Nous avons implémenté quelque chose comme ceci dans notre bibliothèque open source Raisin Toast . La configuration est assez simple une fois que vous avez ajouté les fichiers à votre projet:

Ajouter une propriété à votre délégué d'application:

@property (strong, nonatomic) RZMessagingWindow *errorWindow;

Créez la fenêtre de messagerie par défaut:

self.errorWindow = [RZMessagingWindow defaultMessagingWindow];
[RZErrorMessenger setDefaultMessagingWindow:self.errorWindow];

et ensuite une ligne pour présenter la fenêtre de messagerie:

[RZErrorMessenger displayErrorWithTitle:@"Whoops!" detail:@"Something went horribly wrong and we accidentally cut off the wrong leg"];

Le projet de démonstration met en évidence certaines des personnalisations les plus avancées consistant à ajouter des images et des styles personnalisés.

L'implémentation utilise une seconde UIWindow et, en raison de la méthode de la classe RZErrorMessenger, elle est disponible partout.

11
earnshavian

Peut-être que cela peut aider quelqu'un:

NSString *message = @"Toast kind of message";
UIAlertView *toast = [[UIAlertView alloc] initWithTitle:nil
                                            message:message
                                           delegate:nil
                                  cancelButtonTitle:nil
                                  otherButtonTitles:nil, nil];
[toast show];
int duration = 1; // in seconds

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, duration * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[toast dismissWithClickedButtonIndex:0 animated:YES];
});

UPDATE UIAlertView est obsolète dans IOS 8. Voici le nouveau moyen:

NSString *message = @"Toast kind of message";

UIAlertController *toast =[UIAlertController alertControllerWithTitle:nil
 message:message 
 preferredStyle:UIAlertControllerStyleAlert];
[self presentViewController:toast animated:YES completion:nil];

int duration = 1; // in seconds

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, duration * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
    [toast dismissViewControllerAnimated:YES completion:nil];
});

EDIT: Pour ceux qui utilisent Xamarin.IOS, vous pouvez le faire comme ceci:

new UIAlertView(null, message, null, "OK", null).Show();

en utilisant UIKit; est requis.

9
Daniele D.

Swift 2.0:

Utilisez https://github.com/Rannie/Toast-Swift/blob/master/SwiftToastDemo/Toast/HRToast%2BUIView.Swift .

Téléchargez la classe HRToast + UIView.Swift et faites-la glisser pour la projeter. Assurez-vous de cocher "Copier les éléments si nécessaire" dans la boîte de dialogue.

  //Usage:
  self.view.makeToast(message: "Simple Toast")
  self.view.makeToast(message: "Simple Toast", duration: 2.0, position:HRToastPositionTop)

  self.view.makeToast(message: "Simple Toast", duration: 2.0, position: HRToastPositionCenter, image: UIImage(named: "ic_120x120")!)

  self.view.makeToast(message: "It is just awesome", duration: 2.0, position: HRToastPositionDefault, title: "Simple Toast")

  self.view.makeToast(message: "It is just awesome", duration: 2.0, position: HRToastPositionCenter, title: "Simple Toast", image: UIImage(named: "ic_120x120")!)

  self.view.makeToastActivity()
  self.view.makeToastActivity(position: HRToastPositionCenter)
  self.view.makeToastActivity(position: HRToastPositionDefault, message: "Loading")
  self.view.makeToastActivityWithMessage(message: "Loading")
3
A.G

Une solution Swift 3 prête à être copiée:

import UIKit

public extension UIView {

    public func showToast(message:String, duration:Int = 2000) {

        let toastLabel = UIPaddingLabel();
        toastLabel.padding = 10;
        toastLabel.translatesAutoresizingMaskIntoConstraints = false;
        toastLabel.backgroundColor = UIColor.darkGray;
        toastLabel.textColor = UIColor.white;
        toastLabel.textAlignment = .center;
        toastLabel.text = message;
        toastLabel.numberOfLines = 0;
        toastLabel.alpha = 0.9;
        toastLabel.layer.cornerRadius = 20;
        toastLabel.clipsToBounds = true;

        self.addSubview(toastLabel);

        self.addConstraint(NSLayoutConstraint(item:toastLabel, attribute:.left, relatedBy:.greaterThanOrEqual, toItem:self, attribute:.left, multiplier:1, constant:20));
        self.addConstraint(NSLayoutConstraint(item:toastLabel, attribute:.right, relatedBy:.lessThanOrEqual, toItem:self, attribute:.right, multiplier:1, constant:-20));
        self.addConstraint(NSLayoutConstraint(item:toastLabel, attribute:.bottom, relatedBy:.equal, toItem:self, attribute:.bottom, multiplier:1, constant:-20));
        self.addConstraint(NSLayoutConstraint(item:toastLabel, attribute:.centerX, relatedBy:.equal, toItem:self, attribute:.centerX, multiplier:1, constant:0));

        UIView.animate(withDuration:0.5, delay:Double(duration) / 1000.0, options:[], animations: {

            toastLabel.alpha = 0.0;

        }) { (Bool) in

            toastLabel.removeFromSuperview();
        }
    }
}

La classe UIPaddingLabel:

import UIKit

@IBDesignable class UIPaddingLabel: UILabel {

    private var _padding:CGFloat = 0.0;

    public var padding:CGFloat {

        get { return _padding; }
        set {
            _padding = newValue;

            paddingTop = _padding;
            paddingLeft = _padding;
            paddingBottom = _padding;
            paddingRight = _padding;
        }
    }

    @IBInspectable var paddingTop:CGFloat = 0.0;
    @IBInspectable var paddingLeft:CGFloat = 0.0;
    @IBInspectable var paddingBottom:CGFloat = 0.0;
    @IBInspectable var paddingRight:CGFloat = 0.0;

    override func drawText(in rect: CGRect) {
        let insets = UIEdgeInsets(top:paddingTop, left:paddingLeft, bottom:paddingBottom, right:paddingRight);
        super.drawText(in: UIEdgeInsetsInsetRect(rect, insets));
    }

    override var intrinsicContentSize: CGSize {

        get {
            var intrinsicSuperViewContentSize = super.intrinsicContentSize;
            intrinsicSuperViewContentSize.height += paddingTop + paddingBottom;
            intrinsicSuperViewContentSize.width += paddingLeft + paddingRight;
            return intrinsicSuperViewContentSize;
        }
    }
}
2
Tim Autin

Si vous voulez vraiment seulement l'apparence Android toast alors essayez cette bibliothèque, ça marche bien, j'ai utilisé dans quelques-unes de mes applications

https://github.com/ecstasy2/toast-notifications-ios fonctionne bien ...

1
Geet

J'ai décidé de mettre de côté une solution Xamarin.iOS/MonoTouch plus complète qui fonctionne très bien pour moi.

    private async Task ShowToast(string message, UIAlertView toast = null)
    {
        if (null == toast)
        {
            toast = new UIAlertView(null, message, null, null, null);
            toast.Show();
            await Task.Delay(2000);
            await ShowToast(message, toast);
            return;
        }

        UIView.BeginAnimations("");
        toast.Alpha = 0;
        UIView.CommitAnimations();
        toast.DismissWithClickedButtonIndex(0, true);
    }

UPDATEUIAlertView est obsolète dans IOS 8. Voici le nouveau moyen:

var toast = UIAlertController.Create("", message, UIAlertControllerStyle.Alert);
        UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(toast, true, async () =>
        {
            await Task.Delay(2000);
            UIView.BeginAnimations("");
            toast.View.Alpha = 0;
            UIView.CommitAnimations();
            toast.DismissViewController(true, null);
        });

Si vous voulez le pain grillé au bas de l'écran plutôt que dans le milieu d'utilisation 

UIAlertControllerStyle.ActionSheet

Si la méthode est appelée à partir d'un thread en arrière-plan (et non du thread principal de l'interface utilisateur), BeginInvokeOnMainThread est requis, ce qui signifie simplement qu'il faut l'appeler ainsi.

BeginInvokeOnMainThread(() =>
{
 ShowToast(message);
});
1
Daniele D.

Objectif c

+(void)showPositiveMessage :(NSString*)message{
[ViewController showAlertWithBackgroundColor:[UIColor greenColor] textColor:[UIColor whiteColor] message:message];}

+(void)showNegativeMessage :(NSString*)message{
    [ViewController showAlertWithBackgroundColor:[UIColor redColor] textColor:[UIColor whiteColor] message:message];}

+(void)showAlertWithBackgroundColor:(UIColor*)backgroundColor textColor:(UIColor*)textColor message:(NSString*)String{
    AppDelegate* appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate;

    UILabel* label = [[UILabel alloc] initWithFrame:CGRectZero];
    label.textAlignment = NSTextAlignmentCenter;
    label.text = String;
    label.font = [UIFont fontWithName:@"HelveticaNeue" size:FONTSIZE];
    label.adjustsFontSizeToFitWidth = true;
    [label sizeToFit];
    label.numberOfLines = 4;
    label.layer.shadowColor = [UIColor grayColor].CGColor;
    label.layer.shadowOffset = CGSizeMake(4, 3);
    label.layer.shadowOpacity = 0.3;
    label.frame = CGRectMake(320, 64, appDelegate.window.frame.size.width, 44);
    label.alpha = 1;        
    label.backgroundColor = backgroundColor;
    label.textColor = textColor;

    [appDelegate.window addSubview:label];

    CGRect basketTopFrame  = label.frame;
    basketTopFrame.Origin.x = 0;


    [UIView animateWithDuration:2.0 delay:0.0 usingSpringWithDamping:0.5 initialSpringVelocity:0.1 options:UIViewAnimationOptionCurveEaseOut animations: ^(void){
        label.frame = basketTopFrame;
    } completion:^(BOOL finished){
        [label removeFromSuperview];
    }
    ];}

Rapide

Comment faire griller un message dans Swift?

1
Yogesh Lolusare

Je sais que cette question est assez ancienne, mais je me suis retrouvée à me demander la même chose, et j'ai trouvé une solution, alors j'ai pensé partager. Cette méthode permet de rejeter l'alerte après un délai que vous avez défini.

let alertController = UIAlertController(title: "Error", message: "There was a problem logging in, please try again", preferredStyle: UIAlertControllerStyle.alert)
self.present(alertController, animated: true, completion: nil)
let delay = DispatchTime.now() + 1 // change 1 to desired number of seconds
DispatchQueue.main.asyncAfter(deadline: delay) {
  // Your code with delay
  alertController.dismiss(animated: true, completion: nil)
}

Si vous rencontrez une erreur qui bloque votre application, il se peut que alertConroller soit exécuté sur un thread en arrière-plan. Pour résoudre ce problème, enveloppez votre code dans ceci:

DispatchQueue.main.async(execute: {

});

Cette méthode permet de rejeter le message lorsque l'utilisateur clique sur un bouton "OK" situé sous le message.

let alertController = UIAlertController(title: "Error", message: "There was a problem logging in, please try again", preferredStyle: UIAlertControllerStyle.alert)
let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default) { (result : UIAlertAction) -> Void in
                    print("OK")
                }
alertController.addAction(okAction)
self.present(alertController, animated: true, completion: nil)
1
Tyler Pashigian

Daniele D a une solution élégante, mais UIAlertView est obsolète. Utilisez UIAlertController à la place:

    NSString *message = @"Toast message.";

    UIAlertController *toast =[UIAlertController alertControllerWithTitle:nil message:message preferredStyle:UIAlertControllerStyleAlert];
    [self presentViewController:toast animated:YES completion:nil];

    int duration = 2; // in seconds

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, duration * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
        [toast dismissViewControllerAnimated:YES completion:nil];
    });
1
TomV

Voici la documentation: https://developer.Apple.com/documentation/uikit/uialertcontroller

et le est un exemple d'implémentation d'une classe:

class AlertMode: NSObject {

  func alertWithOneAction(title: String, message: String, actionTitle: String, handler: @escaping ((UIAlertAction) -> Void), `on` controller: UIViewController ) -> () {
    let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.alert)
    alert.addAction(UIAlertAction(title: actionTitle, style: UIAlertActionStyle.default, handler: handler))
    controller.present(alert, animated: true, completion: nil)
 }
}
0
ironRoei

Une autre implémentation Swift simple toast . Fichier unique, copiez-le, collez-le dans votre application:

https://github.com/gglresearchanddevelopment/ios-toast

0
Orion Edwards

Swift 4+

Vous n'avez pas besoin de télécharger quoi que ce soit, sauf si vous recherchez une fonctionnalité supplémentaire que UIAlertController ne vous donnera pas. 

let alertbox = UIAlertController(title: "Error", message: "You did not enter an email address", preferredStyle: UIAlertController.Style.alert)
        let okAction = UIAlertAction(title: "OK", style: UIAlertAction.Style.default) { (result : UIAlertAction) -> Void in
            print("OK")
        }
        alertbox.addAction(okAction)
        self.present(alertbox, animated: true, completion: nil)

Le code ci-dessus présente une boîte de dialogue d'alerte avec le titre "Erreur", le message de description, puis un bouton OK afin que l'utilisateur puisse ignorer l'alerte.

0
Will Buffington

J'ai écrit le code le plus simple et il fonctionne toujours parfaitement pour moi toujours.

ajoute cette ligne dans Appdelegate.h

- (void) showToastMessage: (NSString *) message;

Ajoutez le code ci-dessous dans Appdelegate.m

-(void) showToastMessage:(NSString *) message
{

    //if there is already a toast message on the screen so that donot show and return from here only
    if ([self.window.rootViewController.view viewWithTag:100])
    {
        return;
    }

    UILabel *lblMessage = [[UILabel alloc]init];
    lblMessage.tag = 100;
    lblMessage.textAlignment = NSTextAlignmentCenter;
    lblMessage.text = message;
    lblMessage.font = [UIFont systemFontOfSize:12.0];
    lblMessage.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5f];
    lblMessage.textColor = [UIColor whiteColor];

    CGSize textSize = [[lblMessage text] sizeWithAttributes:@{NSFontAttributeName:[lblMessage font]}];

    float x = self.window.rootViewController.view.center.x - textSize.width/2;
    float labelWidth = MIN(textSize.width, SCREEN_WIDTH - 40);

    lblMessage.frame = CGRectMake(x, SCREEN_HEIGHT - 90.f, labelWidth + 50, textSize.height + 20);
    CGRect oldFrame = lblMessage.frame;

    //comment this line if u don't want to show the toost message below in the screen
    lblMessage.center = self.window.rootViewController.view.center;
    x = lblMessage.frame.Origin.x;
    lblMessage.frame = CGRectMake(x, oldFrame.Origin.y, oldFrame.size.width, oldFrame.size.height);

    //and add this line if you want to show the message in the centre of the screen
    //lblMessage.center = self.window.rootViewController.view.center;

    lblMessage.layer.cornerRadius = lblMessage.frame.size.height/2;
    lblMessage.layer.masksToBounds = true;

    [self.window.rootViewController.view addSubview:lblMessage];
    [self performSelector:@selector(removeToastMessage:) withObject:lblMessage afterDelay:2.0f];

}


-(void) removeToastMessage: (UILabel *)label
{
    [UIView animateWithDuration:1.0f animations:^{
        label.alpha = 0.f;
    }];

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [label removeFromSuperview];

    });
}

Maintenant, dans n'importe quel ViewController que vous voulez utiliser, importez simplement le #import "AppDelegate.h"et utilisez le code ci-dessous.

Pour afficher un message de pain grillé

AppDelegate *appDel = (AppDelegate *) [[UIApplication sharedApplication] delegate];
                     NSString *strMessage = @"show my alert";
                     [appDel showToastMessage:strMessage];
0
Yash

Celui-ci est également très pratique puisqu'il comporte également un bloc d'achèvement. Regardez:) https://github.com/PrajeetShrestha/EkToast

0
Prajeet Shrestha