¿Cuál es el equivalente de android.widget.Toast para aplicaciones de iOS?

Hace unos meses hice la aplicación para Android. La class Toast es muy útil para mí. No necesito considerar el hilo principal y el lugar para mostrarlo. En cualquier lugar puedo mostrarlo y simplemente dejarlo y desaparece automáticamente.

Toast.makeToast(context, msg, Toast.LENGTH_SHORT).show(); 

Eso es. ^^

¿Qué pasa con el iPhone? ¿Hay algo así como el brindis? Simplemente muestre el post y no necesita preocuparse por eso. Será automáticamente desaparecido.

No hay una class "fuera de la caja" en UIKit para hacer esto. Pero es bastante fácil crear una class que ofrezca este comportamiento.

Solo tiene que crear una class que henetworkingará de UIView. Esta class tendrá la responsabilidad, para crear lo que desea mostrar, para agregarse en la jerarquía de vista principal, para descartarse usando un timer.

Podrá usarlo como:

 [ToastView toastViewInView:myParentView withText:@"what a wonderful text"]; 

Saludos, Quentin

He estado escribiendo para Android durante mucho time y me falta tostado. He implementado uno. ¿Necesitas un código? aquí estás:

ToastView.h

 #import <UIKit/UIKit.h> @interface ToastView : UIView @property (strong, nonatomic) NSString *text; + (void)showToastInParentView: (UIView *)parentView withText:(NSString *)text withDuaration:(float)duration; @end 

ToastView.m

 #import "ToastView.h" @interface ToastView () @property (strong, nonatomic, readonly) UILabel *textLabel; @end @implementation ToastView @synthesize textLabel = _textLabel; float const ToastHeight = 50.0f; float const ToastGap = 10.0f; - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code } return self; } -(UILabel *)textLabel { if (!_textLabel) { _textLabel = [[UILabel alloc] initWithFrame:CGRectMake(5.0, 5.0, self.frame.size.width - 10.0, self.frame.size.height - 10.0)]; _textLabel.backgroundColor = [UIColor clearColor]; _textLabel.textAlignment = NSTextAlignmentCenter; _textLabel.textColor = [UIColor whiteColor]; _textLabel.numberOfLines = 2; _textLabel.font = [UIFont systemFontOfSize:13.0]; _textLabel.lineBreakMode = NSLineBreakByCharWrapping; [self addSubview:_textLabel]; } return _textLabel; } - (void)setText:(NSString *)text { _text = text; self.textLabel.text = text; } + (void)showToastInParentView: (UIView *)parentView withText:(NSString *)text withDuaration:(float)duration; { //Count toast views are already showing on parent. Made to show several toasts one above another int toastsAlreadyInParent = 0; for (UIView *subView in [parentView subviews]) { if ([subView isKindOfClass:[ToastView class]]) { toastsAlreadyInParent++; } } CGRect parentFrame = parentView.frame; float yOrigin = parentFrame.size.height - (70.0 + ToastHeight * toastsAlreadyInParent + ToastGap * toastsAlreadyInParent); CGRect selfFrame = CGRectMake(parentFrame.origin.x + 20.0, yOrigin, parentFrame.size.width - 40.0, ToastHeight); ToastView *toast = [[ToastView alloc] initWithFrame:selfFrame]; toast.backgroundColor = [UIColor darkGrayColor]; toast.alpha = 0.0f; toast.layer.cornerRadius = 4.0; toast.text = text; [parentView addSubview:toast]; [UIView animateWithDuration:0.4 animations:^{ toast.alpha = 0.9f; toast.textLabel.alpha = 0.9f; }completion:^(BOOL finished) { if(finished){ } }]; [toast performSelector:@selector(hideSelf) withObject:nil afterDelay:duration]; } - (void)hideSelf { [UIView animateWithDuration:0.4 animations:^{ self.alpha = 0.0; self.textLabel.alpha = 0.0; }completion:^(BOOL finished) { if(finished){ [self removeFromSuperview]; } }]; } @end 

Llamada desde ViewController

  [ToastView showToastInParentView:self.view withText:@"What a toast!" withDuaration:5.0]; 

No lo he intentado, pero es posible que desee comprobar:

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

https://github.com/scalessec/Toast

Edit: actualizado para Swift 3

Aquí hay una versión de Swift 3 basada en la respuesta de wojciech_maciejewski. Esto se parece más a Android Toast y no astack tostadas el uno al otro. Dibuja tostadas en el centro de la pantalla. Puede manejar texts largos de varias líneas.

 import UIKit class ToastView: UIView { private static let hLabelGap: CGFloat = 40.0 private static let vLabelGap: CGFloat = 20.0 private static let hToastGap: CGFloat = 20.0 private static let vToastGap: CGFloat = 10.0 private var textLabel: UILabel! static func showInParent(_ parentView: UIView, _ text: String, duration: Double = 3.0) { let labelFrame = CGRect(x: parentView.frame.origin.x + hLabelGap, y: parentView.frame.origin.y + vLabelGap, width: parentView.frame.width - 2 * hLabelGap, height: parentView.frame.height - 2 * vLabelGap) let label = UILabel() label.font = UIFont.systemFont(ofSize: 15.0) label.text = text label.backgroundColor = UIColor.clear label.textAlignment = NSTextAlignment.center label.textColor = UIColor.white label.numberOfLines = 0 label.frame = labelFrame label.sizeToFit() let toast = ToastView() toast.textLabel = label toast.addSubview(label) toast.frame = CGRect(x: label.frame.origin.x - hToastGap, y: label.frame.origin.y - vToastGap, width: label.frame.width + 2 * hToastGap, height: label.frame.height + 2 * vToastGap) toast.backgroundColor = UIColor.darkGray toast.alpha = 0.0 toast.layer.cornerRadius = 20.0 toast.center = parentView.center label.center = CGPoint(x: toast.frame.size.width / 2, y: toast.frame.size.height / 2) parentView.addSubview(toast) UIView.animate(withDuration: 0.4, animations: { toast.alpha = 0.9 label.alpha = 0.9 }) toast.perform(#selector(hideSelf), with: nil, afterDelay: duration) } @objc private func hideSelf() { UIView.animate(withDuration: 0.4, animations: { self.alpha = 0.0 self.textLabel.alpha = 0.0 }, completion: { t in self.removeFromSuperview() }) } } 

Uso de otro controller:

 ToastView.showInParent(navigationController!.view, "Hello world") 

Estoy publicando una versión rápida de la respuesta de Scarmysun 🙂 muchas gracias

 import Foundation import UIKit class ToastView: UIView { static let toastHeight:CGFloat = 50.0 static let toastGap:CGFloat = 10; lazy var textLabel: UILabel = UILabel(frame: CGRectMake(5.0, 5.0, self.frame.size.width - 10.0, self.frame.size.height - 10.0)) static func showInParent(parentView: UIView!, withText text: String, forDuration duration: double_t) { //Count toast views are already showing on parent. Made to show several toasts one above another var toastsAlreadyInParent = 0; for view in parentView.subviews { if (view.isKindOfClass(ToastView)) { toastsAlreadyInParent++ } } var parentFrame = parentView.frame; var yOrigin = parentFrame.size.height - getDouble(toastsAlreadyInParent) var selfFrame = CGRectMake(parentFrame.origin.x + 20.0, yOrigin, parentFrame.size.width - 40.0, toastHeight); var toast = ToastView(frame: selfFrame) toast.textLabel.backgroundColor = UIColor.clearColor() toast.textLabel.textAlignment = NSTextAlignment.Center toast.textLabel.textColor = UIColor.whiteColor() toast.textLabel.numberOfLines = 2 toast.textLabel.font = UIFont.systemFontOfSize(13.0) toast.addSubview(toast.textLabel) toast.backgroundColor = UIColor.darkGrayColor() toast.alpha = 0.0; toast.layer.cornerRadius = 4.0; toast.textLabel.text = text; parentView.addSubview(toast) UIView.animateWithDuration(0.4, animations: { toast.alpha = 0.9 toast.textLabel.alpha = 0.9 }) toast.performSelector(Selector("hideSelf"), withObject: nil, afterDelay: duration) } static private func getDouble(toastsAlreadyInParent : Int) -> CGFloat { return (70.0 + toastHeight * CGFloat(toastsAlreadyInParent) + toastGap * CGFloat(toastsAlreadyInParent)); } func hideSelf() { UIView.animateWithDuration(0.4, animations: { self.alpha = 0.0 self.textLabel.alpha = 0.0 }, completion: { t in self.removeFromSuperview() }) } } 

Puede hacer esto de muchas maneras, uno de los modos es usar UIAlertViewController() en swift3

 let alertManager=UIAlertController(title: nil, message: "Welcome!", prefernetworkingStyle: .alert) self.present(alertManager, animated: true, completion: nil) DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()+1, execute: { alertManager.dismiss(animated: false, completion: nil) }) 
    Intereting Posts