Android Toast в iPhone?

Когда я пишу приложения для Android, мне нравится функция Toast. Есть ли способ получить такой набор и забыть всплывающее сообщение в iPhone, используя MonoTouch (C # .NET)?

Проверь это:

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

Изменить: проект переместился в github, поэтому я обновляю ссылку.

Версия MonoTouch Toast здесь. Вдохновленный Android.

Чтобы назвать это,

ToastView t = new ToastView ("Email Sent", 1000); t.Show (); 

Enum File:

 public enum ToastGravity { Top = 0, Bottom = 1, Center = 2 } 

Файл ToastSettings:

 using System; using System.Drawing; using MonoTouch.UIKit; namespace General { public class ToastSettings { public ToastSettings () { this.Duration = 500; this.Gravity = ToastGravity.Center; } public int Duration { get; set; } public double DurationSeconds { get { return (double) Duration/1000 ;} } public ToastGravity Gravity { get; set; } public PointF Position { get; set; } } } 

Основной класс Toast:

 using System; using MonoTouch.Foundation; using MonoTouch.UIKit; using System.Drawing; using MonoTouch.ObjCRuntime; namespace General { public class ToastView : NSObject { ToastSettings theSettings = new ToastSettings (); private string text = null; UIView view; public ToastView (string Text, int durationMilliseonds) { text = Text; theSettings.Duration = durationMilliseonds; } int offsetLeft = 0; int offsetTop = 0; public ToastView SetGravity (ToastGravity gravity, int OffSetLeft, int OffSetTop) { theSettings.Gravity = gravity; offsetLeft = OffSetLeft; offsetTop = OffSetTop; return this; } public ToastView SetPosition (PointF Position) { theSettings.Position = Position; return this; } public void Show () { UIButton v = UIButton.FromType (UIButtonType.Custom); view = v; UIFont font = UIFont.SystemFontOfSize (16); SizeF textSize = view.StringSize (text, font, new SizeF (280, 60)); UILabel label = new UILabel (new RectangleF (0, 0, textSize.Width + 5, textSize.Height + 5)); label.BackgroundColor = UIColor.Clear; label.TextColor = UIColor.White; label.Font = font; label.Text = text; label.Lines = 0; label.ShadowColor = UIColor.DarkGray; label.ShadowOffset = new SizeF (1, 1); v.Frame = new RectangleF (0, 0, textSize.Width + 10, textSize.Height + 10); label.Center = new PointF (v.Frame.Size.Width / 2, v.Frame.Height / 2); v.AddSubview (label); v.BackgroundColor = UIColor.FromRGBA (0, 0, 0, 0.7f); v.Layer.CornerRadius = 5; UIWindow window = UIApplication.SharedApplication.Windows[0]; PointF point = new PointF (window.Frame.Size.Width / 2, window.Frame.Size.Height / 2); if (theSettings.Gravity == ToastGravity.Top) { point = new PointF (window.Frame.Size.Width / 2, 45); } else if (theSettings.Gravity == ToastGravity.Bottom) { point = new PointF (window.Frame.Size.Width / 2, window.Frame.Size.Height - 45); } else if (theSettings.Gravity == ToastGravity.Center) { point = new PointF (window.Frame.Size.Width / 2, window.Frame.Size.Height / 2); } else { point = theSettings.Position; } point = new PointF (point.X + offsetLeft, point.Y + offsetTop); v.Center = point; window.AddSubview (v); v.AllTouchEvents += delegate { HideToast (null); }; NSTimer.CreateScheduledTimer (theSettings.DurationSeconds, HideToast); } void HideToast () { UIView.BeginAnimations (""); view.Alpha = 0; UIView.CommitAnimations (); } void RemoveToast () { view.RemoveFromSuperview (); } } } 

Вот моя версия: http://github.com/scalessec/toast

Я думаю, что его проще использовать, поскольку он реализован как категория obj-c, тем самым добавив методы makeToast в любой экземпляр UIView. например:

 [self.view makeToast:@"This is some message as toast." duration:3.0 position:@"bottom"]; 

Вы ищете что-то вроде UIAlertView ?

Вы можете использовать эту ссылку для объектного кода для Toast

http://code.google.com/p/toast-notifications-ios/source/browse/trunk/

Хотя эта ссылка для ее использования

http://code.google.com/p/toast-notifications-ios/wiki/HowToUse

Который может быть похож на любой из приведенных ниже образцов

 [[iToast makeText:NSLocalizedString(@"The activity has been successfully saved.", @"")] show]; [[[iToast makeText:NSLocalizedString(@"The activity has been successfully saved.", @"")] setGravity:iToastGravityBottom] show]; [[[[iToast makeText:NSLocalizedString(@"Something to display a very long time", @"")] etGravity:iToastGravityBottom] setDuration:iToastDurationLong] show]; 

Возможно, после Локальных уведомлений вы уверены, что они позволяют вам установить время, я думаю, что в эпоху времени нужно уволить. Не думайте, что есть способ скрыть их. Возможно, я не понимаю ваш вопрос, хотя я не знаком с Тостом.

Я добавил небольшую модификацию в класс тостов, который обрабатывает вращение дисплея.

  public void Show () { UIButton v = UIButton.FromType (UIButtonType.Custom); view = v; UIFont font = UIFont.SystemFontOfSize (16); SizeF textSize = view.StringSize (text, font, new SizeF (280, 60)); UILabel label = new UILabel (new RectangleF (0, 0, textSize.Width + 5, textSize.Height + 5)); label.BackgroundColor = UIColor.Clear; label.TextColor = UIColor.White; label.Font = font; label.Text = text; label.Lines = 0; label.ShadowColor = UIColor.DarkGray; label.ShadowOffset = new SizeF (1, 1); v.Frame = new RectangleF (0, 0, textSize.Width + 10, textSize.Height + 10); label.Center = new PointF (v.Frame.Size.Width / 2, v.Frame.Height / 2); v.AddSubview (label); v.BackgroundColor = UIColor.FromRGBA (0, 0, 0, 0.7f); v.Layer.CornerRadius = 5; UIWindow window = UIApplication.SharedApplication.Windows[0]; PointF point = new PointF (window.Frame.Size.Width / 2, window.Frame.Size.Height / 2); if (theSettings.Gravity == ToastGravity.Top) { point = new PointF (window.Frame.Size.Width / 2, 45); } else if (theSettings.Gravity == ToastGravity.Bottom) { point = new PointF (window.Frame.Size.Width / 2, window.Frame.Size.Height - 45); } else if (theSettings.Gravity == ToastGravity.Center) { point = new PointF (window.Frame.Size.Width / 2, window.Frame.Size.Height / 2); } else { point = theSettings.Position; } point = new PointF (point.X + offsetLeft, point.Y + offsetTop); v.Center = point; //handle screen rotation float orientation=0; switch(UIApplication.SharedApplication.StatusBarOrientation) { case UIInterfaceOrientation.LandscapeLeft: orientation=-90; break; case UIInterfaceOrientation.LandscapeRight: orientation=90; break; case UIInterfaceOrientation.PortraitUpsideDown: orientation=180; break; } v.Transform=CGAffineTransform.MakeRotation ((float)(orientation / 180f * Math.Pi)); window.AddSubview (v); v.AllTouchEvents += delegate { HideToast (); }; NSTimer.CreateScheduledTimer (theSettings.DurationSeconds, HideToast); } 

Вы можете попробовать мою библиотеку с открытым исходным кодом TSMessages: https://github.com/toursprung/TSMessages

Он очень прост в использовании и выглядит красиво на iOS 5/6 и на iOS 7.

Просто вы можете использовать следующий код с uilabel и uianimation для получения тоста, как в android. Он выполняет две работы, одну из которых – это задача для тоста, и она увеличивает высоту метки в соответствии с длиной текста с помощью словаря IOS 7 позже.

 CGRect initialFrame = CGRectMake(20, self.view.frame.size.height/2,300, 40); NSString *message=@"Toast in Iphone as in Android"; UILabel *flashLabel=[[UILabel alloc] initWithFrame:initialFrame]; flashLabel.font=[UIFont fontWithName:@"Optima-Italic" size:12.0]; flashLabel.backgroundColor=[UIColor whiteColor]; flashLabel.layer.cornerRadius=3.0f; flashLabel.numberOfLines=0; flashLabel.textAlignment=NSTextAlignmentCenter; CGSize maxSize = CGSizeMake(flashLabel.frame.size.width, MAXFLOAT); CGRect labelRect = [message boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:flashLabel.font} context:nil]; //adjust the label the the new height. CGRect newFrame = flashLabel.frame; newFrame.size.height = labelRect.size.height; flashLabel.frame = newFrame; flashLabel.text=message; [self.view addSubview:flashLabel]; flashLabel.alpha=1.0; self.view.userInteractionEnabled=FALSE; [UIView animateWithDuration:13.0 animations:^ { flashLabel.alpha=0.0f; } completion:^(BOOL finished) { self.view.userInteractionEnabled=TRUE; [flashLabel removeFromSuperview]; }]; 

Я изменил ответ Джона следующим образом:

Toast.h

 @interface Toast : NSObject + (void)toast:(NSString *)message :(UIView *) view :(int)delay; @end 

Toast.m

 #import "Toast.h" @interface Toast () @end @implementation Toast + (void)toast:(NSString *)message :(UIView *) view :(int)delay { CGRect initialFrame = CGRectMake(10, view.frame.size.height/2, 300, 40); UILabel *flashLabel=[[UILabel alloc] initWithFrame:initialFrame]; flashLabel.font=[UIFont fontWithName:@"Optima-Italic" size:19.0]; flashLabel.backgroundColor=[UIColor whiteColor]; flashLabel.layer.cornerRadius=9.0f; flashLabel.clipsToBounds = YES; flashLabel.numberOfLines=3; flashLabel.textAlignment=NSTextAlignmentCenter; CGSize maxSize = CGSizeMake(flashLabel.frame.size.width, MAXFLOAT); CGRect labelRect = [message boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:flashLabel.font} context:nil]; //adjust the label the the new height. CGRect newFrame = flashLabel.frame; newFrame.size.height = labelRect.size.height * 2; flashLabel.frame = newFrame; flashLabel.text=message; [view addSubview:flashLabel]; flashLabel.alpha=1.0; view.userInteractionEnabled=FALSE; [UIView animateWithDuration:delay animations:^ { flashLabel.alpha=0.0f; } completion:^(BOOL finished) { view.userInteractionEnabled=TRUE; [flashLabel removeFromSuperview]; }]; } @end 

Мне очень нравится решение 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); }); 

Я создал новое репо на github с классом, чтобы сделать iOS-оповещения в стиле тоста. Мне не понравился тот, что был на code.google.com, он не вращался правильно и был некрасивым.

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

Наслаждайтесь людьми.