什么是iOS应用程序的android.widget.Toast等价物?

几个月前我已经做了Android应用程序。 吐司类对我来说非常有用。 我不需要考虑主线程和显示它的地方。 任何地方我可以显示它,只是离开它,它会自动消失。

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

而已。 ^^

那么iPhone呢? 有没有像吐司? 只是显示消息,不需要关心它。 它会自动消失。

UIKit中没有“开箱即用”类来执行此操作。 但是创build一个能够提供这种行为的类是很容易的。

你只需要创build一个从UIViewinheritance的类。 这个类将有责任 – 创build你想要显示的内容, – 把它自己添加到父视图层次结构中 – 使用定时器来解除它自己。

您将能够使用它,如:

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

问候,昆汀

我一直在为Android写作很长一段时间,我很想念吐司。 我已经实施了一个。 需要代码? 这个给你:

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 

从ViewController调用

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

编辑:更新为Swift 3

这是一个基于wojciech_maciejewski的答案的Swift 3版本。 这看起来更像是Android Toast,并不会彼此堆叠在一起。 它将烤面包吸入屏幕中央。 它可以处理长的多行文本。

 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() }) } } 

另一个控制器的用法:

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

我发布斯卡米森答案的迅速版本:)非常感谢

 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() }) } } 

你可以用很多方法做到这一点,其中一种方法是在swift3使用UIAlertViewController()

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