153

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.

5

20 Answers 20

103

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]; 

enter image description here

Sign up to request clarification or add additional context in comments.

4 Comments

For 100% Android-like behaviour I suggest setting hud.isUserInteractionEnabled = false so you can interact with the rest of the app while the message is showing.
@MattiaC. I am not able to set value for hud.isUserInteractionEnabled = false looks like only getter is provided.
it's blocking UI. it's not the same behaviour as Android's one
Use hud.offset = CGPoint(x: 0, y: MBProgressMaxOffset) to position the HUD on the bottom edge.
98
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

This is not exactly the same as toast - user interaction with other views is disabled while dialog is showing. Maybe there is a way to remove 'grayed out' background with adding ability to interact with other views on screen (like buttons or painting canvas in my case behind the alert)?
UIAlertView has been deprecated in iOS9. Is there any alternate way to do this?
thanks but could I use the UIAlertController to display the toast as well?
57

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.

enter image description here

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

Very well put, especially the notion of reworking the UI. It's definitely not the simplest answer for developers or designers, but Toasts could easily become another mobile UX “junk drawer,” too often used as a dumping ground for content that 1) is chatty and distracting, or 2) is genuinely useful information, and, as such, would be better presented in direct context with the primary content elements of the application as a badge, icon, or inline status message.
49

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

Hi Sazzad, the problem was obviously, that it requires a NavigationController. I was just trying to bring it up. Maybe my comment is wrong and obsolete
happy to hear that u fixed
31

Swift 3

For a simple solution without third party code:

enter image description here

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:

  1. Android like Toast message
  2. Still iOS Look&Feel

2 Comments

Clever one. I would have never thought of this, thanks :D
Thanks, this is the most simple and elegant solution in my opinion.
5

For Swift 3 & 4:

Use Toaster library

Toast(text: "Hello, world!", duration: Delay.long) 

enter image description here

For Swift 2:

Use JLToast

Comments

4

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:

Toast Alert View Image Example

Comments

4

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

too many errors in this code.. changes like .Center to center, whiteColor to white, animateWithDuration to animate(duration, just too many errors.. please fix it..
2

For the ones that using Xamarin.IOS you can do like this:

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

using UIKit; is required.

Comments

2

For me this solution works fine: https://github.com/cruffenach/CRToast

enter image description here

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

2

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

Wow. I had this kind of problem where your code gave me idea what to do. Thanks :)
1

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

1

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

1

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

1

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

0

Again if using IOS on Xamarin there is a new component called BTProgressHUD in the component store

Comments

0

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

0

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

0

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

0

If you want pure swift, we released our internal file. It's pretty simple

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

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.