I need to know if there is any method in iOS which behaves like Toast messages in Android. That is, I need to display a message which is dismissed automatically after few seconds. This is similar to the functionality of the Toast class in the Android environment.
- 1You might want to check this link stackoverflow.com/questions/3522866/android-toast-in-iphoneEmmanuel– Emmanuel2013-09-08 06:11:56 +00:00Commented Sep 8, 2013 at 6:11
- 1You can check this github.com/ecstasy2/toast-notifications-iosRahul– Rahul2013-09-08 07:20:25 +00:00Commented Sep 8, 2013 at 7:20
- This guy has provided the solution stackoverflow.com/questions/3522866/…Dipesh Pokhrel– Dipesh Pokhrel2015-03-12 08:40:43 +00:00Commented Mar 12, 2015 at 8:40
- A nice lib: github.com/scalessec/Toast-SwiftFerran Maylinch– Ferran Maylinch2018-02-15 12:21:10 +00:00Commented Feb 15, 2018 at 12:21
- The library that @FerranMaylinch recommended has the best results imhoNathan F.– Nathan F.2019-11-14 20:25:47 +00:00Commented Nov 14, 2019 at 20:25
20 Answers
You can make use of MBProgressHUD project.
Use HUD mode MBProgressHUDModeText for toast-like behaviour,
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES]; // Configure for text only and offset down hud.mode = MBProgressHUDModeText; hud.label.text = @"Some message..."; hud.margin = 10.f; hud.yOffset = 150.f; hud.removeFromSuperViewOnHide = YES; [hud hideAnimated:YES afterDelay:3]; 
4 Comments
hud.isUserInteractionEnabled = false so you can interact with the rest of the app while the message is showing.hud.isUserInteractionEnabled = false looks like only getter is provided.hud.offset = CGPoint(x: 0, y: MBProgressMaxOffset) to position the HUD on the bottom edge.NSString *message = @"Some message..."; UIAlertView *toast = [[UIAlertView alloc] initWithTitle:nil message:message delegate:nil cancelButtonTitle:nil otherButtonTitles:nil, nil]; [toast show]; int duration = 1; // duration in seconds dispatch_after(dispatch_time(DISPATCH_TIME_NOW, duration * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ [toast dismissWithClickedButtonIndex:0 animated:YES]; }); Using UIAlertViewController for iOS 9 or later
NSString *message = @"Some message..."; UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil message:message preferredStyle:UIAlertControllerStyleAlert]; [self presentViewController:alert animated:YES completion:nil]; int duration = 1; // duration in seconds dispatch_after(dispatch_time(DISPATCH_TIME_NOW, duration * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ [alert dismissViewControllerAnimated:YES completion:nil]; }); Swift 3.2
let message = "Some message..." let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert) self.present(alert, animated: true) // duration in seconds let duration: Double = 5 DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + duration) { alert.dismiss(animated: true) } 3 Comments
In Android, a Toast is a short message that displays on the screen for a short amount of time and then disappears automatically without disrupting user interaction with the app.
So a lot of people coming from an Android background want to know what the iOS version of a Toast is. Besides the current question, other similar questions can be found here, here, and here. The answer is that there is no exact equivalent to a Toast in iOS. Various workarounds that have been presented, though, including
- making your own Toast with a
UIView(see here, here, here, and here) - importing a third party project that mimics a Toast (see here, here, here, and here)
- using a buttonless Alert with a timer (see here)
However, my advice is to stick with the standard UI options that already come with iOS. Don't try to make your app look and behave exactly the same as the Android version. Think about how to repackage it so that it looks and feels like an iOS app. See the following link for some choices.
Consider redesigning the UI in a way that conveys the same information. Or, if the information is very important, then an Alert might be the answer.
1 Comment
Swift 4
How about this small trick?
func showToast(controller: UIViewController, message : String, seconds: Double) { let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert) alert.view.backgroundColor = UIColor.black alert.view.alpha = 0.6 alert.view.layer.cornerRadius = 15 controller.present(alert, animated: true) DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + seconds) { alert.dismiss(animated: true) } } Example of calling:
showToast(controller: self, message : "This is a test", seconds: 2.0) Output:

2 Comments
Swift 3
For a simple solution without third party code:
Just use a normal UIAlertController but with style = actionSheet (look at code down below)
let alertDisapperTimeInSeconds = 2.0 let alert = UIAlertController(title: nil, message: "Toast!", preferredStyle: .actionSheet) self.present(alert, animated: true) DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + alertDisapperTimeInSeconds) { alert.dismiss(animated: true) } The advantage of this solution:
- Android like Toast message
- Still iOS Look&Feel
2 Comments
If you want one with iOS Style, download this framework from Github
iOS Toast Alert View Framework
This examples work on you UIViewController, once you imported the Framework.
Example 1:
//Manual let tav = ToastAlertView() tav.message = "Hey!" tav.image = UIImage(named: "img1")! tav.show() //tav.dismiss() to Hide Example 2:
//Toast Alert View with Time Dissmis Only self.showToastAlert("5 Seconds", image: UIImage(named: "img1")!, hideWithTap: false, hideWithTime: true, hideTime: 5.0) Final:
Comments
Swift 4.0:
Make a new swift file . (File-New-File-Empty Swift File). Name it UIViewToast.Add the following Code.
import UIKit func /(lhs: CGFloat, rhs: Int) -> CGFloat { return lhs / CGFloat(rhs) } let HRToastDefaultDuration = 2.0 let HRToastFadeDuration = 0.2 let HRToastHorizontalMargin : CGFloat = 10.0 let HRToastVerticalMargin : CGFloat = 10.0 let HRToastPositionDefault = "bottom" let HRToastPositionTop = "top" let HRToastPositionCenter = "center" // activity let HRToastActivityWidth : CGFloat = 100.0 let HRToastActivityHeight : CGFloat = 100.0 let HRToastActivityPositionDefault = "center" // image size let HRToastImageViewWidth : CGFloat = 80.0 let HRToastImageViewHeight: CGFloat = 80.0 // label setting let HRToastMaxWidth : CGFloat = 0.8; // 80% of parent view width let HRToastMaxHeight : CGFloat = 0.8; let HRToastFontSize : CGFloat = 16.0 let HRToastMaxTitleLines = 0 let HRToastMaxMessageLines = 0 // shadow appearance let HRToastShadowOpacity : CGFloat = 0.8 let HRToastShadowRadius : CGFloat = 6.0 let HRToastShadowOffset : CGSize = CGSize(width: 4.0, height: 4.0) let HRToastOpacity : CGFloat = 0.5 let HRToastCornerRadius : CGFloat = 10.0 var HRToastActivityView: UnsafePointer<UIView>? var HRToastTimer: UnsafePointer<Timer>? var HRToastView: UnsafePointer<UIView>? // Color Scheme let HRAppColor:UIColor = UIColor.black//UIappViewController().appUIColor let HRAppColor_2:UIColor = UIColor.white let HRToastHidesOnTap = true let HRToastDisplayShadow = false //HRToast (UIView + Toast using Swift) extension UIView { //public methods func makeToast(message msg: String) { self.makeToast(message: msg, duration: HRToastDefaultDuration, position: HRToastPositionDefault as AnyObject) } func makeToast(message msg: String, duration: Double, position: AnyObject) { let toast = self.viewForMessage(msg: msg, title: nil, image: nil) self.showToast(toast: toast!, duration: duration, position: position) } func makeToast(message msg: String, duration: Double, position: AnyObject, title: String) { let toast = self.viewForMessage(msg: msg, title: title, image: nil) self.showToast(toast: toast!, duration: duration, position: position) } func makeToast(message msg: String, duration: Double, position: AnyObject, image: UIImage) { let toast = self.viewForMessage(msg: msg, title: nil, image: image) self.showToast(toast: toast!, duration: duration, position: position) } func makeToast(message msg: String, duration: Double, position: AnyObject, title: String, image: UIImage) { let toast = self.viewForMessage(msg: msg, title: title, image: image) self.showToast(toast: toast!, duration: duration, position: position) } func showToast(toast: UIView) { self.showToast(toast: toast, duration: HRToastDefaultDuration, position: HRToastPositionDefault as AnyObject) } func showToast(toast: UIView, duration: Double, position: AnyObject) { let existToast = objc_getAssociatedObject(self, &HRToastView) as! UIView? if existToast != nil { if let timer: Timer = objc_getAssociatedObject(existToast!, &HRToastTimer) as? Timer { timer.invalidate(); } self.hideToast(toast: existToast!, force: false); } toast.center = self.centerPointForPosition(position: position, toast: toast) toast.alpha = 0.0 if HRToastHidesOnTap { let tapRecognizer = UITapGestureRecognizer(target: toast, action: #selector(handleToastTapped(recognizer:))) toast.addGestureRecognizer(tapRecognizer) toast.isUserInteractionEnabled = true; toast.isExclusiveTouch = true; } self.addSubview(toast) objc_setAssociatedObject(self, &HRToastView, toast, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN) UIView.animate(withDuration: HRToastFadeDuration, delay: 0.0, options: ([.curveEaseOut, .allowUserInteraction]), animations: { toast.alpha = 1.0 }, completion: { (finished: Bool) in let timer = Timer.scheduledTimer(timeInterval: duration, target: self, selector: #selector(self.toastTimerDidFinish(timer:)), userInfo: toast, repeats: false) objc_setAssociatedObject(toast, &HRToastTimer, timer, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) }) } func makeToastActivity() { self.makeToastActivity(position: HRToastActivityPositionDefault as AnyObject) } func showToastActivity() { self.isUserInteractionEnabled = false self.makeToastActivity() } func removeToastActivity() { self.isUserInteractionEnabled = true self.hideToastActivity() } func makeToastActivityWithMessage(message msg: String){ self.makeToastActivity(position: HRToastActivityPositionDefault as AnyObject, message: msg) } func makeToastActivityWithMessage(message msg: String,addOverlay: Bool){ self.makeToastActivity(position: HRToastActivityPositionDefault as AnyObject, message: msg,addOverlay: true) } func makeToastActivity(position pos: AnyObject, message msg: String = "",addOverlay overlay: Bool = false) { let existingActivityView: UIView? = objc_getAssociatedObject(self, &HRToastActivityView) as? UIView if existingActivityView != nil { return } let activityView = UIView(frame: CGRect(x:0, y:0, width: self.frame.width, height: self.frame.height)) activityView.center = self.centerPointForPosition(position: pos, toast: activityView) activityView.alpha = 0.0 activityView.autoresizingMask = ([.flexibleLeftMargin, .flexibleTopMargin, .flexibleRightMargin, .flexibleBottomMargin]) activityView.layer.cornerRadius = HRToastCornerRadius if HRToastDisplayShadow { activityView.layer.shadowColor = UIColor.black.cgColor activityView.layer.shadowOpacity = Float(HRToastShadowOpacity) activityView.layer.shadowRadius = HRToastShadowRadius activityView.layer.shadowOffset = HRToastShadowOffset } let activityIndicatorView = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge) activityIndicatorView.center = CGPoint(x:activityView.bounds.size.width / 2, y: activityView.bounds.size.height / 2) activityIndicatorView.color = HRAppColor activityView.addSubview(activityIndicatorView) activityIndicatorView.startAnimating() if (!msg.isEmpty){ activityIndicatorView.frame.origin.y -= 10 let activityMessageLabel = UILabel(frame: CGRect(x: activityView.bounds.origin.x, y: (activityIndicatorView.frame.origin.y + activityIndicatorView.frame.size.height + 10), width: activityView.bounds.size.width, height: 20)) activityMessageLabel.textColor = UIColor.white activityMessageLabel.font = (msg.count<=10) ? UIFont(name:activityMessageLabel.font.fontName, size: 16) : UIFont(name:activityMessageLabel.font.fontName, size: 16) activityMessageLabel.textAlignment = .center activityMessageLabel.text = msg + ".." if overlay { activityMessageLabel.textColor = UIColor.white activityView.backgroundColor = HRAppColor.withAlphaComponent(HRToastOpacity) activityIndicatorView.color = UIColor.white } else { activityMessageLabel.textColor = HRAppColor activityView.backgroundColor = UIColor.clear activityIndicatorView.color = HRAppColor } activityView.addSubview(activityMessageLabel) } self.addSubview(activityView) // associate activity view with self objc_setAssociatedObject(self, &HRToastActivityView, activityView, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) UIView.animate(withDuration: HRToastFadeDuration, delay: 0.0, options: UIViewAnimationOptions.curveEaseOut, animations: { activityView.alpha = 1.0 }, completion: nil) self.isUserInteractionEnabled = false } func hideToastActivity() { self.isUserInteractionEnabled = true let existingActivityView = objc_getAssociatedObject(self, &HRToastActivityView) as! UIView? if existingActivityView == nil { return } UIView.animate(withDuration: HRToastFadeDuration, delay: 0.0, options: UIViewAnimationOptions.curveEaseOut, animations: { existingActivityView!.alpha = 0.0 }, completion: { (finished: Bool) in existingActivityView!.removeFromSuperview() objc_setAssociatedObject(self, &HRToastActivityView, nil, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) }) } /* * private methods (helper) */ func hideToast(toast: UIView) { self.isUserInteractionEnabled = true self.hideToast(toast: toast, force: false); } func hideToast(toast: UIView, force: Bool) { let completeClosure = { (finish: Bool) -> () in toast.removeFromSuperview() objc_setAssociatedObject(self, &HRToastTimer, nil, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC) } if force { completeClosure(true) } else { UIView.animate(withDuration: HRToastFadeDuration, delay: 0.0, options: ([.curveEaseIn, .beginFromCurrentState]), animations: { toast.alpha = 0.0 }, completion:completeClosure) } } @objc func toastTimerDidFinish(timer: Timer) { self.hideToast(toast: timer.userInfo as! UIView) } @objc func handleToastTapped(recognizer: UITapGestureRecognizer) { // var timer = objc_getAssociatedObject(self, &HRToastTimer) as! NSTimer // timer.invalidate() self.hideToast(toast: recognizer.view!) } func centerPointForPosition(position: AnyObject, toast: UIView) -> CGPoint { if position is String { let toastSize = toast.bounds.size let viewSize = self.bounds.size if position.lowercased == HRToastPositionTop { return CGPoint(x: viewSize.width/2, y: toastSize.height/2 + HRToastVerticalMargin) } else if position.lowercased == HRToastPositionDefault { return CGPoint(x:viewSize.width/2, y:viewSize.height - toastSize.height - 15 - HRToastVerticalMargin) } else if position.lowercased == HRToastPositionCenter { return CGPoint(x:viewSize.width/2, y:viewSize.height/2) } } else if position is NSValue { return position.cgPointValue } print("Warning: Invalid position for toast.") return self.centerPointForPosition(position: HRToastPositionDefault as AnyObject, toast: toast) } func viewForMessage(msg: String?, title: String?, image: UIImage?) -> UIView? { if msg == nil && title == nil && image == nil { return nil } var msgLabel: UILabel? var titleLabel: UILabel? var imageView: UIImageView? let wrapperView = UIView() wrapperView.autoresizingMask = ([.flexibleLeftMargin, .flexibleRightMargin, .flexibleTopMargin, .flexibleBottomMargin]) wrapperView.layer.cornerRadius = HRToastCornerRadius wrapperView.backgroundColor = UIColor.black.withAlphaComponent(HRToastOpacity) if HRToastDisplayShadow { wrapperView.layer.shadowColor = UIColor.black.cgColor wrapperView.layer.shadowOpacity = Float(HRToastShadowOpacity) wrapperView.layer.shadowRadius = HRToastShadowRadius wrapperView.layer.shadowOffset = HRToastShadowOffset } if image != nil { imageView = UIImageView(image: image) imageView!.contentMode = .scaleAspectFit imageView!.frame = CGRect(x:HRToastHorizontalMargin, y: HRToastVerticalMargin, width: CGFloat(HRToastImageViewWidth), height: CGFloat(HRToastImageViewHeight)) } var imageWidth: CGFloat, imageHeight: CGFloat, imageLeft: CGFloat if imageView != nil { imageWidth = imageView!.bounds.size.width imageHeight = imageView!.bounds.size.height imageLeft = HRToastHorizontalMargin } else { imageWidth = 0.0; imageHeight = 0.0; imageLeft = 0.0 } if title != nil { titleLabel = UILabel() titleLabel!.numberOfLines = HRToastMaxTitleLines titleLabel!.font = UIFont.boldSystemFont(ofSize: HRToastFontSize) titleLabel!.textAlignment = .center titleLabel!.lineBreakMode = .byWordWrapping titleLabel!.textColor = UIColor.white titleLabel!.backgroundColor = UIColor.clear titleLabel!.alpha = 1.0 titleLabel!.text = title // size the title label according to the length of the text let maxSizeTitle = CGSize(width: (self.bounds.size.width * HRToastMaxWidth) - imageWidth, height: self.bounds.size.height * HRToastMaxHeight) let expectedHeight = title!.stringHeightWithFontSize(fontSize: HRToastFontSize, width: maxSizeTitle.width) titleLabel!.frame = CGRect(x: 0.0, y: 0.0, width: maxSizeTitle.width, height: expectedHeight) } if msg != nil { msgLabel = UILabel(); msgLabel!.numberOfLines = HRToastMaxMessageLines msgLabel!.font = UIFont.systemFont(ofSize: HRToastFontSize) msgLabel!.lineBreakMode = .byWordWrapping msgLabel!.textAlignment = .center msgLabel!.textColor = UIColor.white msgLabel!.backgroundColor = UIColor.clear msgLabel!.alpha = 1.0 msgLabel!.text = msg let maxSizeMessage = CGSize(width: (self.bounds.size.width * HRToastMaxWidth) - imageWidth, height: self.bounds.size.height * HRToastMaxHeight) let expectedHeight = msg!.stringHeightWithFontSize(fontSize: HRToastFontSize, width: maxSizeMessage.width) msgLabel!.frame = CGRect(x: 0.0, y: 0.0, width: maxSizeMessage.width, height: expectedHeight) } var titleWidth: CGFloat, titleHeight: CGFloat, titleTop: CGFloat, titleLeft: CGFloat if titleLabel != nil { titleWidth = titleLabel!.bounds.size.width titleHeight = titleLabel!.bounds.size.height titleTop = HRToastVerticalMargin titleLeft = imageLeft + imageWidth + HRToastHorizontalMargin } else { titleWidth = 0.0; titleHeight = 0.0; titleTop = 0.0; titleLeft = 0.0 } var msgWidth: CGFloat, msgHeight: CGFloat, msgTop: CGFloat, msgLeft: CGFloat if msgLabel != nil { msgWidth = msgLabel!.bounds.size.width msgHeight = msgLabel!.bounds.size.height msgTop = titleTop + titleHeight + HRToastVerticalMargin msgLeft = imageLeft + imageWidth + HRToastHorizontalMargin } else { msgWidth = 0.0; msgHeight = 0.0; msgTop = 0.0; msgLeft = 0.0 } let largerWidth = max(titleWidth, msgWidth) let largerLeft = max(titleLeft, msgLeft) // set wrapper view's frame let wrapperWidth = max(imageWidth + HRToastHorizontalMargin * 2, largerLeft + largerWidth + HRToastHorizontalMargin) let wrapperHeight = max(msgTop + msgHeight + HRToastVerticalMargin, imageHeight + HRToastVerticalMargin * 2) wrapperView.frame = CGRect(x: 0.0, y: 0.0, width: wrapperWidth, height: wrapperHeight) // add subviews if titleLabel != nil { titleLabel!.frame = CGRect(x: titleLeft, y: titleTop, width: titleWidth, height: titleHeight) wrapperView.addSubview(titleLabel!) } if msgLabel != nil { msgLabel!.frame = CGRect(x: msgLeft, y: msgTop, width: msgWidth, height: msgHeight) wrapperView.addSubview(msgLabel!) } if imageView != nil { wrapperView.addSubview(imageView!) } return wrapperView } } extension String { func stringHeightWithFontSize(fontSize: CGFloat,width: CGFloat) -> CGFloat { let font = UIFont.systemFont(ofSize: fontSize) let size = CGSize(width: width, height: CGFloat.greatestFiniteMagnitude) let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.lineBreakMode = .byWordWrapping; let attributes = [NSAttributedStringKey.font:font, NSAttributedStringKey.paragraphStyle:paragraphStyle.copy()] let text = self as NSString let rect = text.boundingRect(with: size, options:.usesLineFragmentOrigin, attributes: attributes, context:nil) return rect.size.height } } 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") // Hide Toast self.view.hideToast(toast: self.view) self.view.hideToast(toast: self.view, force: true) self.view.hideToastActivity() 1 Comment
For me this solution works fine: https://github.com/cruffenach/CRToast
Example how use it:
NSDictionary *options = @{ kCRToastTextKey : @"Hello World!", kCRToastTextAlignmentKey : @(NSTextAlignmentCenter), kCRToastBackgroundColorKey : [UIColor redColor], kCRToastAnimationInTypeKey : @(CRToastAnimationTypeGravity), kCRToastAnimationOutTypeKey : @(CRToastAnimationTypeGravity), kCRToastAnimationInDirectionKey : @(CRToastAnimationDirectionLeft), kCRToastAnimationOutDirectionKey : @(CRToastAnimationDirectionRight) }; [CRToastManager showNotificationWithOptions:options completionBlock:^{ NSLog(@"Completed"); }]; Comments
Swift 4 syntax for a 3-second delay:
present(alertController, animated: true, completion: nil) DispatchQueue.main.asyncAfter(deadline: .now() + 3) { self.dismiss(animated: true, completion: nil) } 1 Comment
Swift Implementation of Android Toast using Alert which dissipate after 3 secs.
func showAlertView(title: String?, message: String?) { let alertController = UIAlertController(title: title, message: message, preferredStyle: .Alert) let okAction = UIAlertAction(title: "OK", style: .Cancel, handler: nil) alertController.addAction(okAction) self.presentViewController(alertController, animated: true, completion: nil) let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(3 * Double(NSEC_PER_SEC))) dispatch_after(delayTime, dispatch_get_main_queue()) { print("Bye. Lovvy") alertController.dismissViewControllerAnimated(true, completion: nil) } } To Call it simply :
self.showAlertView("Message sent...", message: nil) Comments
For Swift 2.0 and considering https://stackoverflow.com/a/5079536/6144027
//TOAST let alertController = UIAlertController(title: "", message: "This is a Toast.LENGTH_SHORT", preferredStyle: .Alert) self!.presentViewController(alertController, animated: true, completion: nil) let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(2.0 * Double(NSEC_PER_SEC))) dispatch_after(delayTime, dispatch_get_main_queue()) { alertController.dismissViewControllerAnimated(true, completion: nil) } Comments
Here's your solution :
Put Below code into your Xcode project and enjoy,
- (void)showMessage:(NSString*)message atPoint:(CGPoint)point { const CGFloat fontSize = 16; UILabel* label = [[UILabel alloc] initWithFrame:CGRectZero]; label.backgroundColor = [UIColor clearColor]; label.font = [UIFont fontWithName:@"Helvetica-Bold" size:fontSize]; label.text = message; label.textColor = UIColorFromRGB(0x07575B); [label sizeToFit]; label.center = point; [self.view addSubview:label]; [UIView animateWithDuration:0.3 delay:1 options:0 animations:^{ label.alpha = 0; } completion:^(BOOL finished) { label.hidden = YES; [label removeFromSuperview]; }]; } How to use ?
[self showMessage:@"Toast in iOS" atPoint:CGPointMake(160, 695)]; Comments
fully customizable capsule shape toast message with slide in&out animations.
extension UIViewController { func showToast(message : String, fontSize: Int, bgColor: UIColor, textColor: UIColor, width: CGFloat, height: CGFloat, delayTime: Double) { let toastLabel = UILabel(frame: CGRect(x: self.view.frame.size.width/2 - width/2, y: -10, width: width, height: height)) toastLabel.backgroundColor = bgColor toastLabel.textColor = textColor toastLabel.font = UIFont.systemFont(ofSize: CGFloat(fontSize), weight: .bold) toastLabel.textAlignment = .center toastLabel.text = message toastLabel.layer.cornerRadius = height/2 toastLabel.clipsToBounds = true self.view.addSubview(toastLabel) self.view.bringSubviewToFront(toastLabel) UIView.animate(withDuration: 0.5, delay: TimeInterval(delayTime), options: .curveLinear) { toastLabel.center.y += 60 } completion: { (isCompleted) in let timer = Timer.scheduledTimer(withTimeInterval: 2.0, repeats: false, block: { _ in UIView.animate(withDuration: 0.5, delay: TimeInterval(delayTime), options: .curveLinear) { toastLabel.center.y -= 60 } completion: { (isCompleted) in } }) } } }
Comments
1) Download toast-notifications-ios from this link
2) go to Targets -> Build Phases and add -fno-objc-arc to the "compiler Sources" for relevant files
3) make a function and #import "iToast.h"
-(void)showToast :(NSString *)strMessage { iToast * objiTost = [iToast makeText:strMessage]; [objiTost setFontSize:11]; [objiTost setDuration:iToastDurationNormal]; [objiTost setGravity:iToastGravityBottom]; [objiTost show]; } 4) call where you need to display toast message
[self showToast:@"This is example text."]; Comments
I thought off a simple way to do the toast! using UIAlertController without button! We use the button text as our message! get it? see below code:
func alert(title: String?, message: String?, bdy:String) { let alertController = UIAlertController(title: title, message: message, preferredStyle: .Alert) let okAction = UIAlertAction(title: bdy, style: .Cancel, handler: nil) alertController.addAction(okAction) self.presentViewController(alertController, animated: true, completion: nil) let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(2 * Double(NSEC_PER_SEC))) dispatch_after(delayTime, dispatch_get_main_queue()) { //print("Bye. Lovvy") alertController.dismissViewControllerAnimated(true, completion: nil) } } use it like this:
self.alert(nil,message:nil,bdy:"Simple Toast!") // toast self.alert(nil,message:nil,bdy:"Alert") // alert with "Alert" button Comments
This is how I have done in Swift 3.0. I created UIView extension and calling the self.view.showToast(message: "Message Here", duration: 3.0) and self.view.hideToast()
extension UIView{ var showToastTag :Int {return 999} //Generic Show toast func showToast(message : String, duration:TimeInterval) { let toastLabel = UILabel(frame: CGRect(x:0, y:0, width: (self.frame.size.width)-60, height:64)) toastLabel.backgroundColor = UIColor.gray toastLabel.textColor = UIColor.black toastLabel.numberOfLines = 0 toastLabel.layer.borderColor = UIColor.lightGray.cgColor toastLabel.layer.borderWidth = 1.0 toastLabel.textAlignment = .center; toastLabel.font = UIFont(name: "HelveticaNeue", size: 17.0) toastLabel.text = message toastLabel.center = self.center toastLabel.isEnabled = true toastLabel.alpha = 0.99 toastLabel.tag = showToastTag toastLabel.layer.cornerRadius = 10; toastLabel.clipsToBounds = true self.addSubview(toastLabel) UIView.animate(withDuration: duration, delay: 0.1, options: .curveEaseOut, animations: { toastLabel.alpha = 0.95 }, completion: {(isCompleted) in toastLabel.removeFromSuperview() }) } //Generic Hide toast func hideToast(){ if let view = self.viewWithTag(self.showToastTag){ view.removeFromSuperview() } } } Comments
If you want pure swift, we released our internal file. It's pretty simple




