Gibt es eine Möglichkeit, Nachrichten schnell zu rösten?
Ich habe es in Ziel c versucht, konnte aber keine schnelle Lösung finden.
[self.view makeToast:@"Account created Successfully"
duration:0.5
position:@"bottom"];
Antworten:
extension UIViewController { func showToast(message : String, font: UIFont) { let toastLabel = UILabel(frame: CGRect(x: self.view.frame.size.width/2 - 75, y: self.view.frame.size.height-100, width: 150, height: 35)) toastLabel.backgroundColor = UIColor.black.withAlphaComponent(0.6) toastLabel.textColor = UIColor.white toastLabel.font = font toastLabel.textAlignment = .center; toastLabel.text = message toastLabel.alpha = 1.0 toastLabel.layer.cornerRadius = 10; toastLabel.clipsToBounds = true self.view.addSubview(toastLabel) UIView.animate(withDuration: 4.0, delay: 0.1, options: .curveEaseOut, animations: { toastLabel.alpha = 0.0 }, completion: {(isCompleted) in toastLabel.removeFromSuperview() }) } }
Verwenden Sie wie folgt:
self.showToast(message: "Your Toast Message", font: .systemFont(ofSize: 12.0))
quelle
Für Swift 4
Meine Version eines Toasts, der Layoutbeschränkungen verwendet, mit dem Vorteil, dass er für jede Textgröße unverändert funktioniert (basierend auf der Antwort von Tony Franzis):
Ruf einfach an:
Toast.show(message: "My message", myViewControllerName)
class Toast { static func show(message: String, controller: UIViewController) { let toastContainer = UIView(frame: CGRect()) toastContainer.backgroundColor = UIColor.black.withAlphaComponent(0.6) toastContainer.alpha = 0.0 toastContainer.layer.cornerRadius = 25; toastContainer.clipsToBounds = true let toastLabel = UILabel(frame: CGRect()) toastLabel.textColor = UIColor.white toastLabel.textAlignment = .center; toastLabel.font.withSize(12.0) toastLabel.text = message toastLabel.clipsToBounds = true toastLabel.numberOfLines = 0 toastContainer.addSubview(toastLabel) controller.view.addSubview(toastContainer) toastLabel.translatesAutoresizingMaskIntoConstraints = false toastContainer.translatesAutoresizingMaskIntoConstraints = false let a1 = NSLayoutConstraint(item: toastLabel, attribute: .leading, relatedBy: .equal, toItem: toastContainer, attribute: .leading, multiplier: 1, constant: 15) let a2 = NSLayoutConstraint(item: toastLabel, attribute: .trailing, relatedBy: .equal, toItem: toastContainer, attribute: .trailing, multiplier: 1, constant: -15) let a3 = NSLayoutConstraint(item: toastLabel, attribute: .bottom, relatedBy: .equal, toItem: toastContainer, attribute: .bottom, multiplier: 1, constant: -15) let a4 = NSLayoutConstraint(item: toastLabel, attribute: .top, relatedBy: .equal, toItem: toastContainer, attribute: .top, multiplier: 1, constant: 15) toastContainer.addConstraints([a1, a2, a3, a4]) let c1 = NSLayoutConstraint(item: toastContainer, attribute: .leading, relatedBy: .equal, toItem: controller.view, attribute: .leading, multiplier: 1, constant: 65) let c2 = NSLayoutConstraint(item: toastContainer, attribute: .trailing, relatedBy: .equal, toItem: controller.view, attribute: .trailing, multiplier: 1, constant: -65) let c3 = NSLayoutConstraint(item: toastContainer, attribute: .bottom, relatedBy: .equal, toItem: controller.view, attribute: .bottom, multiplier: 1, constant: -75) controller.view.addConstraints([c1, c2, c3]) UIView.animate(withDuration: 0.5, delay: 0.0, options: .curveEaseIn, animations: { toastContainer.alpha = 1.0 }, completion: { _ in UIView.animate(withDuration: 0.5, delay: 1.5, options: .curveEaseOut, animations: { toastContainer.alpha = 0.0 }, completion: {_ in toastContainer.removeFromSuperview() }) }) } }
quelle
Swift 4
func showToast(message : String) { let toastLabel = UILabel(frame: CGRect(x: self.view.frame.size.width/2 - 75, y: self.view.frame.size.height-100, width: 150, height: 35)) toastLabel.backgroundColor = UIColor.black.withAlphaComponent(0.6) toastLabel.textColor = UIColor.white toastLabel.textAlignment = .center; toastLabel.font = UIFont(name: "Montserrat-Light", size: 12.0) toastLabel.text = message toastLabel.alpha = 1.0 toastLabel.layer.cornerRadius = 10; toastLabel.clipsToBounds = true self.view.addSubview(toastLabel) UIView.animate(withDuration: 4.0, delay: 0.1, options: .curveEaseOut, animations: { toastLabel.alpha = 0.0 }, completion: {(isCompleted) in toastLabel.removeFromSuperview() }) }
Nennen Sie die Funktion wie
self.showToast(message: "Data Save.")
quelle
toastLabel.alpha = 0.0
und dann die folgende Animation machen:UIView.animate(withDuration: 0.5, delay: 0.0, options: .curveEaseIn, animations: { toastLabel.alpha = 1.0 }, completion: { _ in UIView.animate(withDuration: 0.5, delay: 1.5, options: .curveEaseOut, animations: { toastLabel.alpha = 0.0 }, completion: {_ in toastLabel.removeFromSuperview() }) })
Fügen Sie einfach die folgende Methode hinzu. Dies zeigt eine Nachricht in verschiedenen Farben mit Animation an (Nachricht erscheint von links nach rechts und verschwindet).
Swift 3.0 -
class Toast { class private func showAlert(backgroundColor:UIColor, textColor:UIColor, message:String) { let appDelegate: AppDelegate = UIApplication.shared.delegate as! AppDelegate let label = UILabel(frame: CGRect.zero) label.textAlignment = NSTextAlignment.center label.text = message label.font = UIFont(name: "", size: 15) label.adjustsFontSizeToFitWidth = true label.backgroundColor = backgroundColor //UIColor.whiteColor() label.textColor = textColor //TEXT COLOR label.sizeToFit() label.numberOfLines = 4 label.layer.shadowColor = UIColor.gray.cgColor label.layer.shadowOffset = CGSize(width: 4, height: 3) label.layer.shadowOpacity = 0.3 label.frame = CGRect(x: appDelegate.window!.frame.size.width, y: 64, width: appDelegate.window!.frame.size.width, height: 44) label.alpha = 1 appDelegate.window!.addSubview(label) var basketTopFrame: CGRect = label.frame; basketTopFrame.origin.x = 0; UIView.animate(withDuration :2.0, delay: 0.0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.1, options: UIViewAnimationOptions.curveEaseOut, animations: { () -> Void in label.frame = basketTopFrame }, completion: { (value: Bool) in UIView.animate(withDuration:2.0, delay: 2.0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.1, options: UIViewAnimationOptions.curveEaseIn, animations: { () -> Void in label.alpha = 0 }, completion: { (value: Bool) in label.removeFromSuperview() }) }) } class func showPositiveMessage(message:String) { showAlert(backgroundColor: UIColor.green, textColor: UIColor.white, message: message) } class func showNegativeMessage(message:String) { showAlert(backgroundColor: UIColor.red, textColor: UIColor.white, message: message) } }
quelle
Was genau Sie brauchen, ist https://github.com/Rannie/Toast-Swift/blob/master/SwiftToastDemo/Toast/HRToast%2BUIView.swift .
Laden Sie die HRToast + UIView.swift-Klasse herunter und ziehen Sie sie per Drag & Drop in das Projekt. Stellen Sie sicher, dass Sie im Dialogfeld die Option "Elemente bei Bedarf kopieren" aktivieren.
//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")
quelle
self.view.hr_setToastThemeColor(color: #ThemeColor)
ich es versuche , gibt es einen FehlerEs gibt eine Bibliothek von Drittanbietern, die anpassbare Toastbenachrichtigungen mit einer einzigen Codezeile unterstützt. Hier ist ein einfaches Beispiel dafür:
import Toast_Swift ... // basic usage self.view.makeToast("This is a piece of toast") // toast with a specific duration and position self.view.makeToast("This is a piece of toast", duration: 3.0, position: .top)
https://github.com/scalessec/Toast-Swift
(Aktualisiert für Swift 3/4 +)
quelle
Ich habe diese Erweiterung immer verwendet, wenn ich eine Toast-Nachricht wie Android benötige. Kopieren Sie einfach die Erweiterung in Ihr Projekt und rufen Sie dann in Ihrer UIViewController-Klasse die Funktion wie auf
self.toastMessage("Downloading...") // Extention is below extension UIViewController { func toastMessage(_ message: String){ guard let window = UIApplication.shared.keyWindow else {return} let messageLbl = UILabel() messageLbl.text = message messageLbl.textAlignment = .center messageLbl.font = UIFont.systemFont(ofSize: 12) messageLbl.textColor = .white messageLbl.backgroundColor = UIColor(white: 0, alpha: 0.5) let textSize:CGSize = messageLbl.intrinsicContentSize let labelWidth = min(textSize.width, window.frame.width - 40) messageLbl.frame = CGRect(x: 20, y: window.frame.height - 90, width: labelWidth + 30, height: textSize.height + 20) messageLbl.center.x = window.center.x messageLbl.layer.cornerRadius = messageLbl.frame.height/2 messageLbl.layer.masksToBounds = true window.addSubview(messageLbl) DispatchQueue.main.asyncAfter(deadline: .now() + 1) { UIView.animate(withDuration: 1, animations: { messageLbl.alpha = 0 }) { (_) in messageLbl.removeFromSuperview() } } }}
quelle
Ich habe zwei weitere Lösungen für Swift 5:
Beste Lösung (meiner Meinung nach)
Vorteil:
Nachteile:
UILabel
Klasse zu erweitern, um Einrückungen hinzuzufügen. Man könnte darauf verzichten, indem man dasUILabel
in dieUIVIew
.Code:
class ToastLabel: UILabel { var textInsets = UIEdgeInsets.zero { didSet { invalidateIntrinsicContentSize() } } override func textRect(forBounds bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect { let insetRect = bounds.inset(by: textInsets) let textRect = super.textRect(forBounds: insetRect, limitedToNumberOfLines: numberOfLines) let invertedInsets = UIEdgeInsets(top: -textInsets.top, left: -textInsets.left, bottom: -textInsets.bottom, right: -textInsets.right) return textRect.inset(by: invertedInsets) } override func drawText(in rect: CGRect) { super.drawText(in: rect.inset(by: textInsets)) } } extension UIViewController { static let DELAY_SHORT = 1.5 static let DELAY_LONG = 3.0 func showToast(_ text: String, delay: TimeInterval = DELAY_LONG) { let label = ToastLabel() label.backgroundColor = UIColor(white: 0, alpha: 0.5) label.textColor = .white label.textAlignment = .center label.font = UIFont.systemFont(ofSize: 15) label.alpha = 0 label.text = text label.clipsToBounds = true label.layer.cornerRadius = 20 label.numberOfLines = 0 label.textInsets = UIEdgeInsets(top: 10, left: 15, bottom: 10, right: 15) label.translatesAutoresizingMaskIntoConstraints = false view.addSubview(label) let saveArea = view.safeAreaLayoutGuide label.centerXAnchor.constraint(equalTo: saveArea.centerXAnchor, constant: 0).isActive = true label.leadingAnchor.constraint(greaterThanOrEqualTo: saveArea.leadingAnchor, constant: 15).isActive = true label.trailingAnchor.constraint(lessThanOrEqualTo: saveArea.trailingAnchor, constant: -15).isActive = true label.bottomAnchor.constraint(equalTo: saveArea.bottomAnchor, constant: -30).isActive = true UIView.animate(withDuration: 0.5, delay: 0, options: .curveEaseIn, animations: { label.alpha = 1 }, completion: { _ in UIView.animate(withDuration: 0.5, delay: delay, options: .curveEaseOut, animations: { label.alpha = 0 }, completion: {_ in label.removeFromSuperview() }) }) } }
Wie benutzt man:
class MyController: UIViewController { override func viewDidLoad() { super.viewDidLoad() showToast("Message") } }
Andere Lösung
Vorteil:
UIViewController
Nachteile:
Code:
class Helper { static let DELAY_SHORT = 1.5 static let DELAY_LONG = 3.0 static func showToast(_ text: String, delay: TimeInterval = DELAY_LONG) { guard let window = UIApplication.shared.keyWindow else { return } let label = BaseLabel() label.backgroundColor = UIColor(white: 0, alpha: 0.5) label.textColor = .white label.textAlignment = .center label.font = UIFont.systemFont(ofSize: 15) label.alpha = 0 label.text = text label.numberOfLines = 0 var vertical: CGFloat = 0 var size = label.intrinsicContentSize var width = min(size.width, window.frame.width - 60) if width != size.width { vertical = 10 label.textAlignment = .justified } label.textInsets = UIEdgeInsets(top: vertical, left: 15, bottom: vertical, right: 15) size = label.intrinsicContentSize width = min(size.width, window.frame.width - 60) label.frame = CGRect(x: 20, y: window.frame.height - 90, width: width, height: size.height + 20) label.center.x = window.center.x label.layer.cornerRadius = min(label.frame.height/2, 25) label.layer.masksToBounds = true window.addSubview(label) UIView.animate(withDuration: 0.5, delay: 0, options: .curveEaseIn, animations: { label.alpha = 1 }, completion: { _ in UIView.animate(withDuration: 0.5, delay: delay, options: .curveEaseOut, animations: { label.alpha = 0 }, completion: {_ in label.removeFromSuperview() }) }) } }
Wie benutzt man:
Helper.showToast("Message")
quelle
label.heightAnchor.constraint(equalToConstant: 35).active = true
, um die Ansichtshöhe so einzustellen, dass die Beschriftung über und unter dem Text einen Abstand lässt.Swift 5, Wenn Sie einfachen Toast verwenden möchten, finden Sie den folgenden Code.
extension UIViewController{ func showToast(message : String, seconds: Double){ let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert) alert.view.backgroundColor = .black alert.view.alpha = 0.5 alert.view.layer.cornerRadius = 15 self.present(alert, animated: true) DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + seconds) { alert.dismiss(animated: true) } } }
Rufen Sie es von UIViewController auf
self.showToast(message: "Updating...", seconds: 1.0)
quelle
Wenn eine einfache Toast-Nachricht ohne ausgefallene Anpassung von Schriftart, Ausrichtung, Textfarbe usw. erforderlich ist, reicht Folgendes aus
let messageVC = UIAlertController(title: "Message Title", message: "Account Created successfully" , preferredStyle: .actionSheet) present(messageVC, animated: true) { Timer.scheduledTimer(withTimeInterval: 0.5, repeats: false, block: { (_) in messageVC.dismiss(animated: true, completion: nil)})}
.actionSheet
Zeigt die Warnung am unteren Bildschirmrand an und der Timer kümmert sich um die Anzeigedauer. Sie können dies als Erweiterung zu UIViewController hinzufügen und dann von überall aus aufrufen.quelle
Wenn
makeToast:duration:position:
in Ziel-c definiert und aufgerufen werden kann, lautet der schnelle Codeself.view.makeToast("Acount created Successfully", duration: 0.5, position: "bottom")
Möglicherweise müssen Sie jedoch einen Bridging-Header verwenden , um Zugriff auf diese Methode in Ihrem Swift-Code zu erhalten.
quelle
@ mr-bean Code aktualisiert auf die neueste Swift-Version (3.x)
let toastLabel = UILabel(frame: CGRect(x: self.view.frame.size.width/2 - 150, y: self.view.frame.size.height-100, width: 300, height: 35)) toastLabel.backgroundColor = UIColor.black toastLabel.textColor = UIColor.white toastLabel.textAlignment = NSTextAlignment.center self.view.addSubview(toastLabel) toastLabel.text = message toastLabel.alpha = 1.0 toastLabel.layer.cornerRadius = 10; toastLabel.clipsToBounds = true UIView.animate(withDuration: 4.0, animations: { toastLabel.alpha = 0.0 })
quelle
Ich habe die Antwort von @ samo geändert mit:
Jetzt passt die Nachricht ihre Breite entsprechend der Nachricht an und wird zentriert.
extension UIViewController { func showToast(message: String) { let toastContainer = UIView(frame: CGRect()) toastContainer.backgroundColor = UIColor.black.withAlphaComponent(0.6) toastContainer.alpha = 0.0 toastContainer.layer.cornerRadius = 20; toastContainer.clipsToBounds = true let toastLabel = UILabel(frame: CGRect()) toastLabel.textColor = UIColor.white toastLabel.textAlignment = .center; toastLabel.font.withSize(12.0) toastLabel.text = message toastLabel.clipsToBounds = true toastLabel.numberOfLines = 0 toastContainer.addSubview(toastLabel) self.view.addSubview(toastContainer) toastLabel.translatesAutoresizingMaskIntoConstraints = false toastContainer.translatesAutoresizingMaskIntoConstraints = false let centerX = NSLayoutConstraint(item: toastLabel, attribute: .centerX, relatedBy: .equal, toItem: toastContainer, attribute: .centerXWithinMargins, multiplier: 1, constant: 0) let lableBottom = NSLayoutConstraint(item: toastLabel, attribute: .bottom, relatedBy: .equal, toItem: toastContainer, attribute: .bottom, multiplier: 1, constant: -15) let lableTop = NSLayoutConstraint(item: toastLabel, attribute: .top, relatedBy: .equal, toItem: toastContainer, attribute: .top, multiplier: 1, constant: 15) toastContainer.addConstraints([centerX, lableBottom, lableTop]) let containerCenterX = NSLayoutConstraint(item: toastContainer, attribute: .centerX, relatedBy: .equal, toItem: self.view, attribute: .centerX, multiplier: 1, constant: 0) let containerTrailing = NSLayoutConstraint(item: toastContainer, attribute: .width, relatedBy: .equal, toItem: toastLabel, attribute: .width, multiplier: 1.1, constant: 0) let containerBottom = NSLayoutConstraint(item: toastContainer, attribute: .bottom, relatedBy: .equal, toItem: self.view, attribute: .bottom, multiplier: 1, constant: -75) self.view.addConstraints([containerCenterX,containerTrailing, containerBottom]) UIView.animate(withDuration: 0.5, delay: 0.0, options: .curveEaseIn, animations: { toastContainer.alpha = 1.0 }, completion: { _ in UIView.animate(withDuration: 0.5, delay: 1.5, options: .curveEaseOut, animations: { toastContainer.alpha = 0.0 }, completion: {_ in toastContainer.removeFromSuperview() }) }) } }
quelle
Anstatt zu verwenden,
UILabel
werdenUITextView
bessere Ergebnisse erzielt.func showToast(message: String) { let toastLabel = UITextView(frame: CGRect(x: self.view.frame.size.width/16, y: self.view.frame.size.height-150, width: self.view.frame.size.width * 7/8, height: 35)) toastLabel.backgroundColor = UIColor.black.withAlphaComponent(0.6) toastLabel.textColor = UIColor.white toastLabel.textAlignment = .center; toastLabel.text = " \(message) " toastLabel.alpha = 1.0 toastLabel.layer.cornerRadius = 10; toastLabel.clipsToBounds = true toastLabel.font = UIFont(name: (toastLabel.font?.fontName)!, size: 16) toastLabel.layoutEdgeInsets.left = 8 toastLabel.layoutEdgeInsets.right = 8 toastLabel.center.x = self.view.frame.size.width/2 self.view.addSubview(toastLabel) UIView.animate(withDuration: 5.0, delay: 0.1, options: .curveEaseOut, animations: { toastLabel.alpha = 0.0 }, completion: {(isCompleted) in toastLabel.removeFromSuperview() }) }
Mit der Meldung wird Platz hinzugefügt, um an beiden Enden einen guten Abstand zu gewährleisten, damit er gut aussieht. Geänderte Version der Antwort von Mr.Bean
quelle
Ich weiß, dass es akzeptierte Antworten gibt, aber alle scheinen einen großen Fehler zu haben - wenn Sie in kurzer Zeit mehrere Toasts zeigen, werden sie übereinander angezeigt. Hier ist meine Implementierung, die dieses Problem berücksichtigt:
class Toast: UILabel { private let BOTTOM_MARGIN: CGFloat = 16 private let SIDE_MARGIN: CGFloat = 16 private let HEIGHT: CGFloat = 35 private let SHOW_TIME_SECONDS = TimeInterval(3) private let BACKGROUND_COLOR = UIColor.darkGray.withAlphaComponent(0.7).cgColor private let TEXT_COLOR = UIColor.white private let ANIMATION_DURATION_SEC = 0.33 private static var queue: [ToastHolder] = [] private static var showing: Toast? init(_ text: String) { super.init(frame: CGRect(x: 0, y: 0, width: 0, height: 0)) self.text = text self.textColor = TEXT_COLOR textAlignment = .center self.layer.backgroundColor = BACKGROUND_COLOR self.layer.cornerRadius = 5 } public func show(_ parent: UIViewController) { frame = CGRect(x: SIDE_MARGIN, y: UIScreen.main.bounds.height - BOTTOM_MARGIN - HEIGHT, width: UIScreen.main.bounds.width - 2 * SIDE_MARGIN, height: HEIGHT) if Toast.showing == nil { Log.d("showing \(String(describing: text))") Toast.showing = self alpha = 0 parent.view.addSubview(self) UIView.animate(withDuration: ANIMATION_DURATION_SEC, animations: { self.alpha = 1 }, completion: { (completed) in Timer.scheduledTimer(timeInterval: self.SHOW_TIME_SECONDS, target: self, selector: #selector(self.onTimeout), userInfo: nil, repeats: false) }) } else { Toast.queue.append(ToastHolder(self, parent)) } } @objc func onTimeout() { UIView.animate(withDuration: ANIMATION_DURATION_SEC, animations: { self.alpha = 0 }, completion: { (completed) in Toast.showing = nil self.removeFromSuperview() if !Toast.queue.isEmpty { let holder = Toast.queue.removeFirst() holder.toast.show(holder.parent) } }) } required init?(coder aDecoder: NSCoder) { fatalError("this initializer is not supported") } private class ToastHolder { let toast: Toast let parent: UIViewController init(_ t: Toast, _ p: UIViewController) { toast = t parent = p } } }
Verwendung:
Toast("my message").show(self)
Hoffe es hilft jemandem.
quelle
Wie wäre es mit Toaster
Auf einen Blick
Toast(text: "Hello, world!").show()
Verzögerung und Dauer einstellen
Toast(text: "Hello, world!", duration: Delay.long) Toast(text: "Hello, world!", delay: Delay.short, duration: Delay.long)
Toast entfernen
let toast = Toast(text: "Hello") toast.show() toast.cancel() // remove toast immediately
Erscheinungsbild anpassen
quelle
static func popUp(context ctx: UIViewController, msg: String) { let toast = UILabel(frame: CGRect(x: 16, y: ctx.view.frame.size.height / 2, width: ctx.view.frame.size.width - 32, height: 100)) toast.backgroundColor = UIColor.lightGray toast.textColor = UIColor.white toast.textAlignment = .center; toast.numberOfLines = 3 toast.font = UIFont.systemFont(ofSize: 20) toast.layer.cornerRadius = 12; toast.clipsToBounds = true toast.text = msg ctx.view.addSubview(toast) UIView.animate(withDuration: 5.0, delay: 0.2, options: .curveEaseOut, animations: { toast.alpha = 0.0 }, completion: {(isCompleted) in toast.removeFromSuperview() }) }
Dann rufen Sie es einfach von UIViewController aus auf
popUp(context: self, msg: "Your message")
quelle
Lassen Sie mich dies zu dieser Antwortkette hinzufügen: Diese Bibliothek macht das, was Sie brauchen DCToastView, sodass Sie Toastnachrichten von der oberen oder unteren Seite des Bildschirms bereitstellen können:
Sie müssen nur den Pod hinzufügen
pod 'DCToastView'
Importieren Sie es dort, wo Sie es verwenden möchten.
import DCToastView
Und benutze es
ToastPresenter.shared.show(in: self.view, message: "This is a toast")
Sie können die folgenden Eigenschaften an die show-Methode übergeben:
quelle
Dies wird Ihnen helfen, den Toast in der Mitte mit der richtigen Polsterung zu machen
func showToast(message:String,view:UIView){ let toastLabel = PaddingLabel() toastLabel.frame = CGRect(x:0, y: view.frame.size.height-100, width: view.frame.width-50, height: 0) toastLabel.backgroundColor = UIColor.black.withAlphaComponent(0.6) toastLabel.textColor = UIColor.white toastLabel.textAlignment = .center; toastLabel.font = UIFont(name: "Montserrat-Light", size: 12.0) toastLabel.text = message toastLabel.alpha = 1.0 toastLabel.layer.cornerRadius = 10; toastLabel.clipsToBounds = true toastLabel.sizeToFit() toastLabel.frame.origin.x=(view.frame.width/2)-(toastLabel.frame.width/2) view.addSubview(toastLabel) UIView.animate(withDuration: 4.0, delay: 0.1, options: .curveEaseOut, animations: { toastLabel.alpha = 0.0 }, completion: {(isCompleted) in toastLabel.removeFromSuperview() }) }
Fügen Sie diese PaddingLabel-Datei zum Auffüllen von Etiketten hinzu
import Foundation import UIKit class PaddingLabel: UILabel { let padding=UIEdgeInsetsMake(5, 10, 5,10) override func drawText(in rect: CGRect) { super.drawText(in: UIEdgeInsetsInsetRect(rect, padding)) } override func sizeThatFits(_ size: CGSize) -> CGSize { let superSizeThatFits=super.sizeThatFits(size) let width=superSizeThatFits.width+padding.left+padding.right let height=superSizeThatFits.height+padding.top+padding.bottom return CGSize(width: width, height: height) } }
quelle
Mr. Beans Antwort funktioniert gut. Seine Antwort verwendet jedoch eine kleine Breite und ist nicht mehrzeilig. Verwenden Sie dies stattdessen.
func showToastFaded(message : String) { let toastLabel = UILabel(frame: CGRect(x: self.view.frame.size.width/2 - 125, y: self.view.frame.size.height-100, width: 250, height: 35)) toastLabel.numberOfLines = 0 toastLabel.backgroundColor = UIColor.black.withAlphaComponent(0.6) toastLabel.textColor = UIColor.white toastLabel.textAlignment = .center; toastLabel.text = message toastLabel.alpha = 1.0 toastLabel.layer.cornerRadius = 10; toastLabel.clipsToBounds = true toastLabel.sizeToFit() toastLabel.frame = CGRect( x: toastLabel.frame.minX, y: toastLabel.frame.minY,width: toastLabel.frame.width + 20, height: toastLabel.frame.height + 8) self.view.addSubview(toastLabel) UIView.animate(withDuration: 4.0, delay: 0.1, options: .curveEaseOut, animations: { toastLabel.alpha = 0.0 }, completion: {(isCompleted) in toastLabel.removeFromSuperview() }) }
quelle
Sie können Ihren eigenen Toaststil erstellen und ihn wie folgt an der Mitte des gesamten Bildschirms ausrichten:
func showToast(message: String, in viewController: UIViewController) { let toastContainer: UIView = { let view = UIView(frame: CGRect()) view.translatesAutoresizingMaskIntoConstraints = false view.backgroundColor = UIColor.gray view.alpha = 0.0 view.layer.cornerRadius = 12 view.clipsToBounds = true return view }() let toastLabel: UILabel = { let label = UILabel() label.translatesAutoresizingMaskIntoConstraints = false label.text = message label.textColor = UIColor.white label.textAlignment = .center label.font = label.font.withSize(20) label.clipsToBounds = true label.numberOfLines = 0 return label }() toastContainer.addSubview(toastLabel) viewController.view.addSubview(toastContainer) toastContainer.layer.zPosition = 1 NSLayoutConstraint.activate([ toastContainer.widthAnchor.constraint(equalToConstant: viewController.view.frame.width * 0.6), toastContainer.heightAnchor.constraint(equalToConstant: viewController.view.frame.height * 0.1), toastContainer.centerXAnchor.constraint(equalTo: viewController.view.centerXAnchor), toastContainer.bottomAnchor.constraint(equalTo: viewController.view.bottomAnchor, constant: -UIScreen.main.bounds.maxY / 2 + viewController.view.frame.height * 0.1 / 2 ), toastLabel.centerXAnchor.constraint(equalTo: toastContainer.centerXAnchor), toastLabel.centerYAnchor.constraint(equalTo: toastContainer.centerYAnchor) ]) UIView.animate(withDuration: 0.5, delay: 0.0, options: .curveEaseIn, animations: { toastContainer.alpha = 1.0 }) { (_) in UIView.animate(withDuration: 0.5, delay: 2, options: .curveEaseOut, animations: { toastContainer.alpha = 0.0 }) { (_) in toastContainer.removeFromSuperview() } } }
quelle
Swift 4.2 Sehr einfach und super
let toastLabel = UILabel() toastLabel.lineBreakMode = .byWordWrapping toastLabel.numberOfLines = 0 toastLabel.text = "Type your message you want to show in toast" toastLabel.sizeToFit() //MARK Resize the Label Frame toastLabel.frame = CGRect(x: toastLabel.frame.origin.x, y: toastLabel.frame.origin.y, width: toastLabel.frame.size.width + 40, height: toastLabel.frame.size.height + 40) self.view.addSubview(toastLabel)
quelle