2010-11-19 3 views
12

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

ответ

9

Проверьте это:

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

Edit: Проект переехал в GitHub, так что я обновить ссылку.

+0

Могу ли я проверить его на siumulator? Кажется, я не работаю для меня. Я создал тост в методе viewDidLoad моего контроллера. –

+0

это работает на симуляторе. можете ли вы пройти образец кода. – clide313

+1

Это действительно хорошо, но LGPL-лицензирован, поэтому вы не можете использовать его в приложении для iPhone, не делая все свои источники под LGPL тоже. Причина, по которой iPhone отличается от обычного: iPhone использует статические библиотеки. –

2

Вы ищете что-то наподобие UIAlertView?

+0

Нет, для этого требуется таймер, чтобы показать и скрыть. Что-то более простое, возможно, консервированный класс из сообщества Open Source. Тосты внутренне заботятся о большем количестве сантехники. –

+0

Почему бы не создать класс, который завершает представление предупреждения и таймер? Возможно, вы могли бы открыть источник, который, таким образом, решает вашу проблему и, возможно, проблемы других людей. – Jasarien

+0

Jasarien прав, проблема, которую вы хотите решить, довольно проста и также очень полезна, тосты рок. Это было бы большой помощью для сообщества. – blindstuff

1

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

14

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

Назвать,

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

Enum Файл:

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

    } 
} 
+0

Хороший парень, ваш перевод прекрасен. – clide313

+0

, в каком типе файла мы должны написать этот код? – Azhar

+1

Это класс C#, поэтому в AnyThingYouWant.cs отлично –

-1

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

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

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

+0

Создание зависимости от огромной библиотеки Three20 делает ее слишком тяжелой. IMO – Roger

+0

Я использую ее успешно уже более года, но, конечно, каждый проект должен включать в себя то, что говорит вам ваше сердце. – esilver

4

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

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

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

Есть ли способ отключить родительское представление, чтобы пользователь не мог щелкнуть от тоста активности? Мне нужно, чтобы пользователь прекратил взаимодействие с приложением, пока отображается тост активности. (Только тост активности, остальное не нуждается в этом поведении.) – jkcl

2

Вы можете использовать эту ссылку для Objective-C код для 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]; 
0

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

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

    } 
0

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

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

0

Just Вы можете использовать следующий код с uilabel и uianimation, чтобы получить тост как в Android. Это делает две работы один тост задача, и она увеличивает высоту метки в зависимости от длины текста с WordWrap IOS-позже link here

CGRect initialFrame = CGRectMake(20, self.view.frame.size.height/2,300, 40); 


NSString *[email protected]"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]; 
}]; 
0

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

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 
0

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

Это блокирует взаимодействие пользователя до момента отображения Тоста, это не относится к Toast в Android. –

+0

Спасибо, что комментировали. Как бы вы избежали этого? –