Android Toast в iPhone?

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

Ответ 2

Версия для тоста MonoTouch. Вдохновленный 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 ();
        }

    }
}

Ответ 3

Здесь моя версия: http://github.com/scalessec/toast

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

    }

Ответ 8

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

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

Ответ 9

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

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];
}];

Ответ 10

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

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

Ответ 11

Мне очень нравится решение MonoTouch, предложенное Bahai.

Ниже не подстановка. Это всего лишь готовый к использованию один метод, который работал у меня.

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

Ответ 12

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

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

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