Android Toast эквивалент в iOS
Кто-нибудь знает, что эквивалент Java Toast этого события Objective C для iOS будет в фрагменте?
Ниже приведен пример того, что я написал в iOS. То, что я ищу в Alert на Java, используя Toast вместо iOS UIAlert. Прошу прощения, если я не сделал это ясно на моем оригинальном посте.
- (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];
}
}
Ответы
Ответ 1
Я нашел этот удивительный класс в github, который работает как шарм.
Тост для iOS
Достаточно импортировать файлы UIView + Toast.h и UIView + Toast.m, а затем добавить
[self.view makeToast:@"This is a piece of toast."];
как написано на примерах страниц.
Ответ 2
В iOS нет эквивалента тоста для Android.
Но всегда есть обходные пути, например
вы можете анимировать представление и играть с его альфа
Ниже приведен пример кода, а не решение
UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:3.0f];
imageView.alpha = 0.0f;
[UIView commitAnimations];
Если вы не хотите постепенно исчезать в течение 3 секунд, вы можете использовать
[UIView setAnimationDelay:3];
и уменьшите продолжительность дуги анимации до 0,5f или что-то еще. я думаю, что использование короткого времени затухания лучше, чем просто установить скрыть на YES
Ответ 3
Мы реализовали что-то подобное в нашей библиотеке с открытым исходным кодом Изюм-тост. Программа установки довольно проста после добавления файлов в проект:
Добавьте свойство к делегату приложения:
@property (strong, nonatomic) RZMessagingWindow *errorWindow;
Создайте окно обмена сообщениями по умолчанию:
self.errorWindow = [RZMessagingWindow defaultMessagingWindow];
[RZErrorMessenger setDefaultMessagingWindow:self.errorWindow];
а затем одну строку, чтобы представить окно обмена сообщениями:
[RZErrorMessenger displayErrorWithTitle:@"Whoops!" detail:@"Something went horribly wrong and we accidentally cut off the wrong leg"];
В демонстрационном проекте показаны некоторые из более продвинутых настроек добавления изображений и пользовательских стилей.
В реализации используется второй UIWindow и из-за метода класса RZErrorMessenger, который доступен везде.
Ответ 4
Я обработал его простым статическим методом помощника пользовательского интерфейса, используя окно ключа:
+(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];
}
];
}];
}
Ответ 5
Возможно, это может помочь кому-то:
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];
});
EDIT:
Для тех, кто использует Xamarin.IOS, вы можете сделать следующее:
new UIAlertView(null, message, null, "OK", null).Show();
с использованием UIKit; не требуется.
Ответ 6
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")
Ответ 7
Если вы действительно хотите только внешний вид азартных игр, попробуйте эту библиотеку, она хорошо работает, использовалась в нескольких моих приложениях
https://github.com/ecstasy2/toast-notifications-ios работает хорошо...
Ответ 8
Я решил разделить более полное решение 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);
}
Если метод вызывается из фонового потока (а не основного потока пользовательского интерфейса), тогда требуется BeginInvokeOnMainThread, что означает просто вызвать его так.
BeginInvokeOnMainThread(() =>
{
ShowToast(message);
});
Ответ 9
Цель 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?
Ответ 10
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;
}
}
}
Ответ 11
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];
});
Ответ 12
Это очень удобно, так как у него есть блок завершения, пожалуйста, посмотрите:)
https://github.com/PrajeetShrestha/EkToast
Ответ 13
Я знаю, что этот вопрос довольно старый, но я обнаружил, что здесь интересно то же самое, и я нашел решение, поэтому я думал, что поделюсь. Этот метод позволяет увольнять предупреждение после установленного вами времени.
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: {
});
Этот метод позволяет отклонить сообщение, когда пользователь нажимает кнопку "ОК" под сообщением
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)
Ответ 14
Вы можете использовать, я использую это все время, это прекрасно работает в объективе c.
+(void)showToastOnView:(UIView * _Nonnull)view withString:(NSString * _Nonnull)text forDuration:(AVToastDurationStatus)duration;
здесь:
AviToast Github.