Wie Toast Nachricht in Swift?

72

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"];
Aabid Khan
quelle

Antworten:

164
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))
MR Bean
quelle
4
Perfekte Antwort. Sie können 'toastLabel.font = UIFont (Name: "IranSansMobile", Größe: 19)' hinzufügen, um die Schriftart der Toastnachricht zu ändern.
Milad Faridnia
1
Die Beschriftung sollte aus der Ansicht entfernt werden, wenn die Animation endet.
Sulthan
1
@ Sulthan du bist willkommen für eine Bearbeitung oder ein Upgrade der Antwort, sonst werde ich die Antwort bald aktualisieren !!
Mr. Bean
2
Wenn Sie die vollständige Nachricht mehrzeilig anzeigen möchten, können Sie Folgendes verwenden: let toastLabel = UILabel (frame: CGRect (x: 0, y: self.view.frame.size.height-100, width: (self). view.frame.width - 10), height: 35)) toastLabel.numberOfLines = 0 Sie können die Höhe entsprechend ändern.
Udaya Sri
2
Die Antwort ist fast perfekt, da es nicht funktioniert, wenn etwas im Vollbildmodus angezeigt wird. Sie müssen die Addsubview von UIApplication.shared.keyWindow ändern. .addSubview (toastLabel)
Jean Raymond Daher
51

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()
            })
        })
    }
}
Samo
quelle
2
Hier gibt es eine große Auswahl. Ich habe diesen ausgewählt.
Dale
@ Samo schön, danke. Nur der toastContainer ist bei Verwendung eines iPhone X teilweise hinter der UITabBar verborgen. In c3 habe ich -75 in -100 geändert, um das Problem zu beheben.
Mario Huizinga
Es ist wunderbar und ermöglicht es Ihnen, es ohne einen Dritten zu tun. Ich verwende es überall in meiner App. Danke für diese Antwort.
Onur Thunfisch
1
Wunderbar! Aber ich habe ein bisschen Einschränkungen für toastContainer geändert, um eine dynamische Breite zu haben und es als Erweiterung von UIViewController zu machen. Hier ist: let c1 = NSLayoutConstraint (Element: toastContainer, Attribut: .width, relatedBy: .lessThanOrEqual, toItem: view, Attribut: .width, Multiplikator: 1, Konstante: -90) let c2 = NSLayoutConstraint (Element: toastContainer, Attribut : .centerX, relatedBy: .equal, toItem: view, Attribut: .centerX, Multiplikator: 1, Konstante: 1)
sVd
27

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.")
Tony Franzis
quelle
1
Ich würde mit einem beginnen toastLabel.alpha = 0.0und 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() }) })
Samo
1
Die meisten Antworten zeigen nur die Funktion und vergessen, wie man sie
aufruft
13

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)
    }
}
Yogesh Lolusare
quelle
11

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")
AG
quelle
Wie kann ich die Farbe des Toasts ändern? Wenn self.view.hr_setToastThemeColor(color: #ThemeColor)ich es versuche , gibt es einen Fehler
Dory
11

Es 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 +)

Mathema
quelle
8

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()
    }
    }
}}
Gopal Krishan
quelle
Platzern Sie nicht nur Code heraus! Wenn Sie Text hinzufügen, um zu beschreiben, wie dieser Code die Frage am besten beantwortet, wird der langfristige Wert der Antwort verbessert und verhindert, dass sie während der Überprüfung gelöscht wird.
NightOwl888
1
Code war selbsterklärend, Sir, aber ich habe ihn trotzdem bearbeitet. Wenn nicht richtig gemacht, bitte sagen.
Gopal Krishan
7

Ich habe zwei weitere Lösungen für Swift 5:

Beste Lösung (meiner Meinung nach)

Vorteil:

  1. Funktioniert ordnungsgemäß beim Drehen des Bildschirms.
  2. Einschränkungen werden zur Positionierung verwendet.
  3. Funktioniert ordnungsgemäß mit SafeArea.

Nachteile:

  1. Es ist erforderlich, die UILabelKlasse zu erweitern, um Einrückungen hinzuzufügen. Man könnte darauf verzichten, indem man das UILabelin die UIVIew.

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:

  1. In dieser Version verwende ich keine Bindung an UIViewController

Nachteile:

  1. Nach dem Drehen des Bildschirms bewegt sich das Etikett nicht.
  2. Funktioniert nicht richtig mit mehrzeiligen Zeichenfolgen.

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")
Vergiliy
quelle
Sie können auch hinzufügen 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.
Siralexsir88
5

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)
Sonu Rajput
quelle
4

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

.actionSheetZeigt 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.

Abhishek
quelle
3

Wenn makeToast:duration:position:in Ziel-c definiert und aufgerufen werden kann, lautet der schnelle Code

self.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.

Tomahh
quelle
3

@ 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
    })
romualdr
quelle
3

Ich habe die Antwort von @ samo geändert mit:

  • Richtige Variablennamen

  • Führende und nachfolgende Einschränkungen wurden in mittlere Einschränkungen geändert.

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()
                })
            })
        }
    }
AR
quelle
Das Ändern der Größe funktioniert gut, aber Sie können die Schriftgröße nicht einstellen
user2161301
toastLabel.font = toastLabel.font.withSize (40)
user2161301
1

Anstatt zu verwenden, UILabelwerden UITextViewbessere 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

JavaGhost
quelle
1

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
1

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

  • Hintergrundfarbe
  • Eckenradius
  • textInsets
  • Textfarbe
  • Schriftart
  • bottomOffsetPortrait
  • bottomOffsetLandscape
  • shadowPath
  • shadowColor
  • shadowOpacity
  • shadowOffset
  • shadowRadius
  • maxWidthRatio
  • useSafeAreaForBottomOffset
Cruz
quelle
0
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")
Andrew
quelle
0

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:

DCToastViewSample

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:

  • Ansicht : Die Ansicht, in der der Toast präsentiert wird
  • Nachricht : Die Nachricht, die der Toast anzeigt
  • toastPlace : Der Ort, der .down oder .up sein kann
  • backgroundColor : Die Hintergrundfarbe des Toasts; Der Standardwert ist Schwarz
  • textColor : Die Textfarbe der Nachricht. Der Standardwert ist Weiß
  • timeOut : Die Anzahl der Sekunden, die der Toast verwerfen muss, wenn er nicht angegeben wird, bedeutet, dass der Toast klebrig bleibt (bis er berührt wird). Der Standardwert ist null
  • Rundheit : Wie rund der Toast sein wird: .none, .low, .mid, .high; Der Standardwert ist .mid
vberihuete
quelle
0

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)
}
}
Arjun Othayoth
quelle
0

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()
    })
}
Grantespo
quelle
0

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()
            }
        }
    }
Sieger
quelle
-1

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)
Shakeel Ahmed
quelle