このiOS Objective Cイベントに相当する Java Toast がフラグメント内にあることを誰もが知っていますか?以下は、私がiOSで書いたもののサンプルです。 iOS UIAlertの代わりにToastを使用して、同じアラートをJavaで探しています。元の投稿でそれを明確にしないとすみません。
- (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];
}
}
Githubでこの素晴らしいクラスを見つけました。 iOS用Toast UIView + Toast.hおよびUIView + Toast.mファイルをインポートして追加するだけで十分です
[self.view makeToast:@"This is a piece of toast."];
ページの例に書かれているように。
キーウィンドウを使用した単純な静的UIヘルパーメソッドで処理しました。
+(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];
}
];
}];
}
IOSにはトーストに相当するAndroidはありません。
しかし、次のような回避策が常にあります
ビューをアニメーション化して、そのアルファで遊ぶことができます
以下はソリューションではなく単なるサンプルコードです
UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:3.0f];
imageView.alpha = 0.0f;
[UIView commitAnimations];
3秒以内にゆっくりフェードしたくない場合は、使用できます
[UIView setAnimationDelay:3];
アニメーションの持続時間を0.5f程度に減らします。単に非表示をYESに設定するよりも、短いフェードアウト時間を使用する方が良いと思います
オープンソースライブラリ Raisin Toast にこのようなものを実装しました。ファイルをプロジェクトに追加すると、セットアップは非常に簡単です。
アプリのデリゲートにプロパティを追加します。
@property (strong, nonatomic) RZMessagingWindow *errorWindow;
デフォルトのメッセージングウィンドウを作成します。
self.errorWindow = [RZMessagingWindow defaultMessagingWindow];
[RZErrorMessenger setDefaultMessagingWindow:self.errorWindow];
メッセージングウィンドウを表示する1行:
[RZErrorMessenger displayErrorWithTitle:@"Whoops!" detail:@"Something went horribly wrong and we accidentally cut off the wrong leg"];
デモプロジェクトでは、画像とカスタムスタイルを追加するより高度なカスタマイズのいくつかを強調しています。
実装では2番目のUIWindowを使用しますが、RZErrorMessengerクラスメソッドのため、どこでも使用できます。
たぶんこれは誰かを助けることができます:
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は、IOS 8.で非推奨になりました。ここで新しい方法:
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];
});
編集: Xamarin.IOSを使用している場合、次のようにできます。
new UIAlertView(null, message, null, "OK", null).Show();
uIKitを使用します。必要とされている。
A Swift 3コピーペーストの準備ができたソリューション:
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();
}
}
}
UIPaddingLabelクラス:
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;
}
}
}
Swift 2.0:
https://github.com/Rannie/Toast-Swift/blob/master/SwiftToastDemo/Toast/HRToast%2BUIView.Swift を使用します。
HRToast + UIView.Swiftクラスをダウンロードし、プロジェクトにドラッグアンドドロップします。ダイアログボックスで[必要に応じてアイテムをコピー]をオンにします。
//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")
本当にAndroidトーストの外観が必要な場合は、このライブラリを試してください。
https://github.com/ecstasy2/toast-notifications-ios はうまく動作します...
私は、自分に最適な、より完全なXamarin.iOS/MonoTouchソリューションを用意することにしました。
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);
}
[〜#〜] update [〜#〜] UIAlertViewは、IOS 8.で非推奨になりました。ここで新しい方法:
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);
});
トーストを途中で使用するのではなく、画面の下部で使用する場合
UIAlertControllerStyle.ActionSheet
メソッドが(メインUIスレッドではなく)バックグラウンドスレッドから呼び出される場合、BeginInvokeOnMainThreadが必要です。つまり、このように呼び出すだけです。
BeginInvokeOnMainThread(() =>
{
ShowToast(message);
});
目的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
私はこの質問がかなり古いことを知っていますが、私はここで同じことを疑問に思っており、解決策を見つけたので、共有したいと思いました。この方法では、ユーザーが設定した遅延時間後にアラートを削除できます。
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)
}
アプリをクラッシュさせるエラーが発生した場合、alertConrollerがバックグラウンドスレッドで実行されている可能性があります。これを修正するには、コードを次のようにラップします。
DispatchQueue.main.async(execute: {
});
このメソッドを使用すると、ユーザーがメッセージの下にある「OK」ボタンをクリックしたときにメッセージを閉じることができます
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)
Daniele Dにはエレガントなソリューションがありますが、UIAlertViewは非推奨です。代わりに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];
});
これはドキュメントです: https://developer.Apple.com/documentation/uikit/uialertcontroller
そして、クラスを実装する例です:
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)
}
}
別のSwift単純なトースト実装。単一ファイル、コピーしてアプリに貼り付けます:
スイフト4+
UIAlertControllerが提供しない追加の機能を探している場合を除き、何もダウンロードする必要はありません。
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)
上記のコードは、「エラー」というタイトルの警告ダイアログ、説明メッセージ、そしてユーザーが警告を消すことができるように「OK」ボタンを示しています。
私は最も簡単なコードを作成しましたが、それは常に私にとって常に完璧に機能します。
Appdelegate.hにこの行を追加
void)showToastMessage:(NSString *)メッセージ;
---(Appdelegate.mに以下のコードを追加
-(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];
});
}
これで、使用するViewControllerで#import "AppDelegate.h"
をインポートし、以下のコードを使用するだけです。
トーストメッセージの表示用
AppDelegate *appDel = (AppDelegate *) [[UIApplication sharedApplication] delegate];
NSString *strMessage = @"show my alert";
[appDel showToastMessage:strMessage];
補完ブロックもあるので、これも非常に便利です。ご覧ください:) https://github.com/PrajeetShrestha/EkToast