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];
}
}
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.
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];
}
];
}];
}
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
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.
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.
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")
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;
}
}
}
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 ...
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);
});
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
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)
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];
});
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)
}
}
Une autre implémentation Swift simple toast . Fichier unique, copiez-le, collez-le dans votre application:
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.
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];
Celui-ci est également très pratique puisqu'il comporte également un bloc d'achèvement. Regardez:) https://github.com/PrajeetShrestha/EkToast