Android Toast in iPhone?

后端 未结 12 827
轮回少年
轮回少年 2020-12-05 20:38

When I write Android apps, I love the Toast feature. Is there a way to get this kind of set and forget popup message in iPhone development using MonoTouch (C# .NET)?

相关标签:
12条回答
  • 2020-12-05 21:03

    I created a new repo on github with a class to do iOS toast-style alerts. I didn't like the one on code.google.com, it didn't rotate properly and wasn't pretty.

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

    Enjoy folks.

    0 讨论(0)
  • 2020-12-05 21:09

    Just You can use the following code with uilabel and uianimation to get toast like in android. It does two works one is toast task and it increases the height of the label according to the text length with wordwrap IOS 7 later link here

    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];
    }];
    
    0 讨论(0)
  • 2020-12-05 21:12

    Check this out:

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

    Edit: The project has moved to github so i update the link.

    0 讨论(0)
  • 2020-12-05 21:16

    I have added a little modification to the toast class that handles rotation of the display.

            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 讨论(0)
  • 2020-12-05 21:16

    I really like MonoTouch solution proposed by Bahai.

    The following is not a substitution. Is just a ready-to-go one method the worked for me.

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

    If the method is called from a background thread (not the main UI thread) then BeginInvokeOnMainThread is required which means just call it like this.

    BeginInvokeOnMainThread(() =>
    {
     ShowToast(message);
    });
    
    0 讨论(0)
  • 2020-12-05 21:17

    Here's my version: http://github.com/scalessec/toast

    I think it's simpler to use because it's implemented as a obj-c category, thereby adding the makeToast methods to any instance of UIView. eg:

    [self.view makeToast:@"This is some message as toast."
                duration:3.0
                position:@"bottom"];
    
    0 讨论(0)
提交回复
热议问题