it-swarm.com.de

Android Toast entspricht in iOS

Weiß jemand, was das Java Toast - Äquivalent dieses iOS Objective C-Ereignisses in einem Fragment wäre? Nachfolgend finden Sie ein Beispiel dessen, was ich in iOS geschrieben habe. Wonach ich nach der gleichen Warnung in Java suche, die einen Toast anstelle des iOS-UIAlert verwendet. Es tut mir leid, wenn ich das in meinem ursprünglichen Beitrag nicht klargestellt habe.

- (void) dateLogic {
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat:@"MMMM dd"];
    NSString *theDate = [dateFormat stringFromDate:[NSDate date]];

    //JANUARY
    if ([theDate isEqualToString:@"January 01"]) {

        feastDay = [[UIAlertView alloc]
                     initWithTitle:@"New Years Day!"
                     message:@"January 01"
                     delegate:self
                     cancelButtonTitle:nil
                     otherButtonTitles:@"Close", nil];
        feastDay.delegate = self;
        [feastDay show];
    }
}
25
Bil Kimes

Ich habe diese erstaunliche Klasse in github gefunden, die wie ein Zauber wirkt . Toast für iOS Es reicht aus, die Dateien UIView + Toast.h und UIView + Toast.m zu importieren und dann hinzuzufügen 

[self.view makeToast:@"This is a piece of toast."];

wie in den Seitenbeispielen geschrieben.

28

Ich habe es mit einer einfachen statischen UI-Hilfemethode mithilfe des Schlüsselfensters behandelt:

+(void)displayToastWithMessage:(NSString *)toastMessage
{
    [[NSOperationQueue mainQueue] addOperationWithBlock:^ {
        UIWindow * keyWindow = [[UIApplication sharedApplication] keyWindow];
        UILabel *toastView = [[UILabel alloc] init];
        toastView.text = toastMessage;
        toastView.font = [MYUIStyles getToastHeaderFont];
        toastView.textColor = [MYUIStyles getToastTextColor];
        toastView.backgroundColor = [[MYUIStyles getToastBackgroundColor] colorWithAlphaComponent:0.9];
        toastView.textAlignment = NSTextAlignmentCenter;
        toastView.frame = CGRectMake(0.0, 0.0, keyWindow.frame.size.width/2.0, 100.0);
        toastView.layer.cornerRadius = 10;
        toastView.layer.masksToBounds = YES;
        toastView.center = keyWindow.center;

        [keyWindow addSubview:toastView];

        [UIView animateWithDuration: 3.0f
                          delay: 0.0
                        options: UIViewAnimationOptionCurveEaseOut
                     animations: ^{
                         toastView.alpha = 0.0;
                     }
                     completion: ^(BOOL finished) {
                         [toastView removeFromSuperview];
                     }
         ];
    }];
}
11
wboland

Es gibt kein Android-Toast-Äquivalent in iOS.

Es gibt aber immer Problemumgehungen wie 

sie können eine Ansicht animieren und mit ihrem Alpha spielen 

Der untenstehende Beispielcode ist keine Lösung

UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:3.0f];
imageView.alpha = 0.0f;
[UIView commitAnimations];

wenn Sie nicht langsam innerhalb von 3 Sekunden verblassen möchten, können Sie verwenden

[UIView setAnimationDelay:3];

und reduzieren Sie die Animationsdauer auf 0.5f oder etwas. Ich denke, eine kurze Ausblendzeit fühlt sich besser an, als sich einfach auf YES zu verstecken

11
Vivo

Wir haben so etwas in unsere Open Source-Bibliothek Raisin Toast implementiert. Das Setup ist ziemlich einfach, wenn Sie die Dateien zu Ihrem Projekt hinzufügen:

Fügen Sie Ihrem App-Delegierten eine Eigenschaft hinzu:

@property (strong, nonatomic) RZMessagingWindow *errorWindow;

Erstellen Sie das Standard-Messaging-Fenster:

self.errorWindow = [RZMessagingWindow defaultMessagingWindow];
[RZErrorMessenger setDefaultMessagingWindow:self.errorWindow];

und dann eine Zeile, um das Nachrichtenfenster anzuzeigen:

[RZErrorMessenger displayErrorWithTitle:@"Whoops!" detail:@"Something went horribly wrong and we accidentally cut off the wrong leg"];

Das Demoprojekt zeigt einige der erweiterten Anpassungen beim Hinzufügen von Bildern und benutzerdefinierten Stilen.

Die Implementierung verwendet ein zweites UIWindow und ist aufgrund der Klassenmethode RZErrorMessenger überall verfügbar.

11
earnshavian

Vielleicht kann dies jemandem helfen:

NSString *message = @"Toast kind of message";
UIAlertView *toast = [[UIAlertView alloc] initWithTitle:nil
                                            message:message
                                           delegate:nil
                                  cancelButtonTitle:nil
                                  otherButtonTitles:nil, nil];
[toast show];
int duration = 1; // in seconds

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, duration * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[toast dismissWithClickedButtonIndex:0 animated:YES];
});

UPDATE UIAlertView ist in IOS 8 veraltet. Hier der neue Weg:

NSString *message = @"Toast kind of message";

UIAlertController *toast =[UIAlertController alertControllerWithTitle:nil
 message:message 
 preferredStyle:UIAlertControllerStyleAlert];
[self presentViewController:toast animated:YES completion:nil];

int duration = 1; // in seconds

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, duration * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
    [toast dismissViewControllerAnimated:YES completion:nil];
});

EDIT: Für diejenigen, die Xamarin.IOS verwenden, können Sie Folgendes tun:

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

mit UIKit; Wird benötigt.

9
Daniele D.

Swift 2.0:

Verwenden Sie 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 ein Projekt. Stellen Sie sicher, dass Sie im Dialogfeld die Option "Elemente 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")
3
A.G

Eine Swift-3-Lösung zum Einfügen:

import UIKit

public extension UIView {

    public func showToast(message:String, duration:Int = 2000) {

        let toastLabel = UIPaddingLabel();
        toastLabel.padding = 10;
        toastLabel.translatesAutoresizingMaskIntoConstraints = false;
        toastLabel.backgroundColor = UIColor.darkGray;
        toastLabel.textColor = UIColor.white;
        toastLabel.textAlignment = .center;
        toastLabel.text = message;
        toastLabel.numberOfLines = 0;
        toastLabel.alpha = 0.9;
        toastLabel.layer.cornerRadius = 20;
        toastLabel.clipsToBounds = true;

        self.addSubview(toastLabel);

        self.addConstraint(NSLayoutConstraint(item:toastLabel, attribute:.left, relatedBy:.greaterThanOrEqual, toItem:self, attribute:.left, multiplier:1, constant:20));
        self.addConstraint(NSLayoutConstraint(item:toastLabel, attribute:.right, relatedBy:.lessThanOrEqual, toItem:self, attribute:.right, multiplier:1, constant:-20));
        self.addConstraint(NSLayoutConstraint(item:toastLabel, attribute:.bottom, relatedBy:.equal, toItem:self, attribute:.bottom, multiplier:1, constant:-20));
        self.addConstraint(NSLayoutConstraint(item:toastLabel, attribute:.centerX, relatedBy:.equal, toItem:self, attribute:.centerX, multiplier:1, constant:0));

        UIView.animate(withDuration:0.5, delay:Double(duration) / 1000.0, options:[], animations: {

            toastLabel.alpha = 0.0;

        }) { (Bool) in

            toastLabel.removeFromSuperview();
        }
    }
}

Die UIPaddingLabel-Klasse:

import UIKit

@IBDesignable class UIPaddingLabel: UILabel {

    private var _padding:CGFloat = 0.0;

    public var padding:CGFloat {

        get { return _padding; }
        set {
            _padding = newValue;

            paddingTop = _padding;
            paddingLeft = _padding;
            paddingBottom = _padding;
            paddingRight = _padding;
        }
    }

    @IBInspectable var paddingTop:CGFloat = 0.0;
    @IBInspectable var paddingLeft:CGFloat = 0.0;
    @IBInspectable var paddingBottom:CGFloat = 0.0;
    @IBInspectable var paddingRight:CGFloat = 0.0;

    override func drawText(in rect: CGRect) {
        let insets = UIEdgeInsets(top:paddingTop, left:paddingLeft, bottom:paddingBottom, right:paddingRight);
        super.drawText(in: UIEdgeInsetsInsetRect(rect, insets));
    }

    override var intrinsicContentSize: CGSize {

        get {
            var intrinsicSuperViewContentSize = super.intrinsicContentSize;
            intrinsicSuperViewContentSize.height += paddingTop + paddingBottom;
            intrinsicSuperViewContentSize.width += paddingLeft + paddingRight;
            return intrinsicSuperViewContentSize;
        }
    }
}
2
Tim Autin

Wenn Sie wirklich nur das Android-Toast-Aussehen haben möchten, probieren Sie diese Bibliothek aus

https://github.com/ecstasy2/toast-notifications-ios funktioniert gut ...

1
Geet

Ich entschied mich für eine komplettere Xamarin.iOS/MonoTouch-Lösung, die für mich gut funktioniert.

    private async Task ShowToast(string message, UIAlertView toast = null)
    {
        if (null == toast)
        {
            toast = new UIAlertView(null, message, null, null, null);
            toast.Show();
            await Task.Delay(2000);
            await ShowToast(message, toast);
            return;
        }

        UIView.BeginAnimations("");
        toast.Alpha = 0;
        UIView.CommitAnimations();
        toast.DismissWithClickedButtonIndex(0, true);
    }

UPDATEUIAlertView ist in IOS 8 veraltet. Hier der neue Weg:

var toast = UIAlertController.Create("", message, UIAlertControllerStyle.Alert);
        UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(toast, true, async () =>
        {
            await Task.Delay(2000);
            UIView.BeginAnimations("");
            toast.View.Alpha = 0;
            UIView.CommitAnimations();
            toast.DismissViewController(true, null);
        });

Wenn Sie den Toast am unteren Rand des Bildschirms anstatt im mittleren Bereich verwenden möchten 

UIAlertControllerStyle.ActionSheet

Wenn die Methode von einem Hintergrundthread (nicht vom Haupt-UI-Thread) aufgerufen wird, ist BeginInvokeOnMainThread erforderlich, das heißt, sie müssen nur so aufgerufen werden.

BeginInvokeOnMainThread(() =>
{
 ShowToast(message);
});
1
Daniele D.

Ziel c

+(void)showPositiveMessage :(NSString*)message{
[ViewController showAlertWithBackgroundColor:[UIColor greenColor] textColor:[UIColor whiteColor] message:message];}

+(void)showNegativeMessage :(NSString*)message{
    [ViewController showAlertWithBackgroundColor:[UIColor redColor] textColor:[UIColor whiteColor] message:message];}

+(void)showAlertWithBackgroundColor:(UIColor*)backgroundColor textColor:(UIColor*)textColor message:(NSString*)String{
    AppDelegate* appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate;

    UILabel* label = [[UILabel alloc] initWithFrame:CGRectZero];
    label.textAlignment = NSTextAlignmentCenter;
    label.text = String;
    label.font = [UIFont fontWithName:@"HelveticaNeue" size:FONTSIZE];
    label.adjustsFontSizeToFitWidth = true;
    [label sizeToFit];
    label.numberOfLines = 4;
    label.layer.shadowColor = [UIColor grayColor].CGColor;
    label.layer.shadowOffset = CGSizeMake(4, 3);
    label.layer.shadowOpacity = 0.3;
    label.frame = CGRectMake(320, 64, appDelegate.window.frame.size.width, 44);
    label.alpha = 1;        
    label.backgroundColor = backgroundColor;
    label.textColor = textColor;

    [appDelegate.window addSubview:label];

    CGRect basketTopFrame  = label.frame;
    basketTopFrame.Origin.x = 0;


    [UIView animateWithDuration:2.0 delay:0.0 usingSpringWithDamping:0.5 initialSpringVelocity:0.1 options:UIViewAnimationOptionCurveEaseOut animations: ^(void){
        label.frame = basketTopFrame;
    } completion:^(BOOL finished){
        [label removeFromSuperview];
    }
    ];}

Swift

Wie Toast Nachricht in Swift?

1
Yogesh Lolusare

Ich weiß, dass diese Frage ziemlich alt ist, aber ich habe mich hier gefragt, und ich habe eine Lösung gefunden. Mit dieser Methode kann der Alarm nach einer von Ihnen festgelegten Zeitverzögerung abgewiesen werden.

let alertController = UIAlertController(title: "Error", message: "There was a problem logging in, please try again", preferredStyle: UIAlertControllerStyle.alert)
self.present(alertController, animated: true, completion: nil)
let delay = DispatchTime.now() + 1 // change 1 to desired number of seconds
DispatchQueue.main.asyncAfter(deadline: delay) {
  // Your code with delay
  alertController.dismiss(animated: true, completion: nil)
}

Wenn Sie eine Fehlermeldung erhalten, die Ihre App zum Absturz bringt, kann dies daran liegen, dass der alertConroller auf einem Hintergrundthread ausgeführt wird. Um dieses Problem zu beheben, wickeln Sie Ihren Code in dieses ein:

DispatchQueue.main.async(execute: {

});

Bei dieser Methode kann die Nachricht verworfen werden, wenn der Benutzer unterhalb der Nachricht auf eine Schaltfläche "OK" klickt

let alertController = UIAlertController(title: "Error", message: "There was a problem logging in, please try again", preferredStyle: UIAlertControllerStyle.alert)
let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default) { (result : UIAlertAction) -> Void in
                    print("OK")
                }
alertController.addAction(okAction)
self.present(alertController, animated: true, completion: nil)
1
Tyler Pashigian

Daniele D hat eine elegante Lösung, aber UIAlertView ist veraltet. Verwenden Sie stattdessen UIAlertController:

    NSString *message = @"Toast message.";

    UIAlertController *toast =[UIAlertController alertControllerWithTitle:nil message:message preferredStyle:UIAlertControllerStyleAlert];
    [self presentViewController:toast animated:YES completion:nil];

    int duration = 2; // in seconds

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, duration * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
        [toast dismissViewControllerAnimated:YES completion:nil];
    });
1
TomV

Dies ist die Dokumentation: https://developer.Apple.com/documentation/uikit/uialertcontroller

und das ist ein Beispiel, um eine Klasse zu implementieren:

class AlertMode: NSObject {

  func alertWithOneAction(title: String, message: String, actionTitle: String, handler: @escaping ((UIAlertAction) -> Void), `on` controller: UIViewController ) -> () {
    let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.alert)
    alert.addAction(UIAlertAction(title: actionTitle, style: UIAlertActionStyle.default, handler: handler))
    controller.present(alert, animated: true, completion: nil)
 }
}
0
ironRoei

Eine weitere einfache Toast-Implementierung von Swift . Einzelne Datei, kopieren und in Ihre App einfügen:

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

0
Orion Edwards

Schnell 4+

Sie müssen nichts herunterladen, es sei denn, Sie suchen nach zusätzlichen Funktionen, die UIAlertController Ihnen nicht bietet. 

let alertbox = UIAlertController(title: "Error", message: "You did not enter an email address", preferredStyle: UIAlertController.Style.alert)
        let okAction = UIAlertAction(title: "OK", style: UIAlertAction.Style.default) { (result : UIAlertAction) -> Void in
            print("OK")
        }
        alertbox.addAction(okAction)
        self.present(alertbox, animated: true, completion: nil)

Der obige Code zeigt einen Alarmdialog mit dem Titel "Error", der Beschreibungsnachricht und einer OK-Schaltfläche, damit der Benutzer die Warnung abbrechen kann.

0
Will Buffington

Ich habe den einfachsten Code geschrieben und es funktioniert immer perfekt für mich.

füge diese Zeile in Appdelegate.h hinzu

- (void) showToastMessage: (NSString *) -Meldung;

Füge den folgenden Code in Appdelegate.m hinzu

-(void) showToastMessage:(NSString *) message
{

    //if there is already a toast message on the screen so that donot show and return from here only
    if ([self.window.rootViewController.view viewWithTag:100])
    {
        return;
    }

    UILabel *lblMessage = [[UILabel alloc]init];
    lblMessage.tag = 100;
    lblMessage.textAlignment = NSTextAlignmentCenter;
    lblMessage.text = message;
    lblMessage.font = [UIFont systemFontOfSize:12.0];
    lblMessage.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5f];
    lblMessage.textColor = [UIColor whiteColor];

    CGSize textSize = [[lblMessage text] sizeWithAttributes:@{NSFontAttributeName:[lblMessage font]}];

    float x = self.window.rootViewController.view.center.x - textSize.width/2;
    float labelWidth = MIN(textSize.width, SCREEN_WIDTH - 40);

    lblMessage.frame = CGRectMake(x, SCREEN_HEIGHT - 90.f, labelWidth + 50, textSize.height + 20);
    CGRect oldFrame = lblMessage.frame;

    //comment this line if u don't want to show the toost message below in the screen
    lblMessage.center = self.window.rootViewController.view.center;
    x = lblMessage.frame.Origin.x;
    lblMessage.frame = CGRectMake(x, oldFrame.Origin.y, oldFrame.size.width, oldFrame.size.height);

    //and add this line if you want to show the message in the centre of the screen
    //lblMessage.center = self.window.rootViewController.view.center;

    lblMessage.layer.cornerRadius = lblMessage.frame.size.height/2;
    lblMessage.layer.masksToBounds = true;

    [self.window.rootViewController.view addSubview:lblMessage];
    [self performSelector:@selector(removeToastMessage:) withObject:lblMessage afterDelay:2.0f];

}


-(void) removeToastMessage: (UILabel *)label
{
    [UIView animateWithDuration:1.0f animations:^{
        label.alpha = 0.f;
    }];

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [label removeFromSuperview];

    });
}

Importieren Sie nun in jedem ViewController den #import "AppDelegate.h"und verwenden Sie den folgenden Code.

Zum Anzeigen von Toast-Nachrichten

AppDelegate *appDel = (AppDelegate *) [[UIApplication sharedApplication] delegate];
                     NSString *strMessage = @"show my alert";
                     [appDel showToastMessage:strMessage];
0
Yash

Dies ist auch sehr praktisch, da es auch einen Abschlussblock gibt. Bitte schauen Sie:) https://github.com/PrajeetShrestha/EkToast

0