Xamarin Forms - Изменить статусбар Цвет кроссплатформенности - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть приложение форм xamarin, и я смог изменить цвет панели навигации. Как я могу изменить цвет строки состояния кроссплатформы? На изображении ниже вы можете видеть зеленый цвет фона панели навигации. Помимо того, что это синий, я хочу изменить цвет этого. Как мне достичь этой кроссплатформенности в формах ксамарина?

enter image description here

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Вы можете использовать DependencyService .

в общем проекте, определить интерфейс

public interface IStatusBarColor
{
    void SetColoredStatusBar(string color);

}

в Android

Во-первых, установить плагин CurrentActivity от nuegt, отметьте https://github.com/jamesmontemagno/CurrentActivityPlugin


using Android.OS;
using Android.Views;
using App24.Droid;
using App24;
using Xamarin.Forms;
using Plugin.CurrentActivity;

[assembly: Dependency(typeof(SetStatusBarColorImplemention))]
namespace App24.Droid
{
    public class SetStatusBarColorImplemention : IStatusBarColor
    {
        public SetStatusBarColorImplemention()
        {
        }

        public void SetColoredStatusBar(string color)
        {
            if (Build.VERSION.SdkInt >= BuildVersionCodes.M)
            {
                Device.BeginInvokeOnMainThread(() =>
                {
                    var currentWindow = GetCurrentWindow();
                    currentWindow.DecorView.SystemUiVisibility = 0;
                    currentWindow.SetStatusBarColor(Android.Graphics.Color.ParseColor(color));
                });
            }
        }

        Window GetCurrentWindow()
        {
            var window = CrossCurrentActivity.Current.Activity.Window;

            window.ClearFlags(WindowManagerFlags.TranslucentStatus);

            window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);

            return window;
        }
    }
}

in iOS


using App24;
using App24.iOS;
using Foundation;
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
using ObjCRuntime;
using CoreGraphics;
[assembly: Dependency(typeof(SetStatusBarColorImplemention))]
namespace App24.iOS
{
    public class SetStatusBarColorImplemention : IStatusBarColor
    {
        public void SetColoredStatusBar(string hexColor)
        {


            if(UIDevice.CurrentDevice.CheckSystemVersion(13, 0))
            {
                UIWindow window = UIApplication.SharedApplication.KeyWindow;
                UIView view = new UIView(window.WindowScene.StatusBarManager.StatusBarFrame);
                window.AddSubview(view);
                Device.BeginInvokeOnMainThread(() =>
                {

                    if (view.RespondsToSelector(new Selector("setBackgroundColor:")))
                    {
                        view.BackgroundColor = Color.FromHex(hexColor).ToUIColor();
                    }

                    UIApplication.SharedApplication.SetStatusBarStyle(UIStatusBarStyle.LightContent, false);
                    topViewControllerWithRootViewController(UIApplication.SharedApplication.KeyWindow.RootViewController).SetNeedsStatusBarAppearanceUpdate();
                });

            }


            else
            {
                Device.BeginInvokeOnMainThread(() =>
                {
                    UIView statusBar = UIApplication.SharedApplication.ValueForKey(new NSString("statusBar")) as UIView;
                    if (statusBar.RespondsToSelector(new Selector("setBackgroundColor:")))
                    {
                        statusBar.BackgroundColor = Color.FromHex(hexColor).ToUIColor();
                    }
                    UIApplication.SharedApplication.SetStatusBarStyle(UIStatusBarStyle.LightContent, false);
                    topViewControllerWithRootViewController(UIApplication.SharedApplication.KeyWindow.RootViewController).SetNeedsStatusBarAppearanceUpdate();
                });
            }


        }

        UIViewController topViewControllerWithRootViewController(UIViewController rootViewController)
        {
            if (rootViewController is UITabBarController)
            {
                UITabBarController tabBarController = (UITabBarController)rootViewController;
                return topViewControllerWithRootViewController(tabBarController.SelectedViewController);
            }
            else if (rootViewController is UINavigationController)
            {
                UINavigationController navigationController = (UINavigationController)rootViewController;
                return topViewControllerWithRootViewController(navigationController.VisibleViewController);
            }
            else if (rootViewController.PresentedViewController != null)
            {
                UIViewController presentedViewController = rootViewController.PresentedViewController;
                return topViewControllerWithRootViewController(presentedViewController);
            }
            else
            {
                return rootViewController;
            }
        }

    }
}

Теперь вызывается строка, как вы хотите .

DependencyService.Get<IStatusBarColor>().SetColoredStatusBar("#00ff00");  // set the color of bar as green

enter image description here

0 голосов
/ 15 апреля 2020

Насколько мне известно, вам нужно установить цвет строки состояния на каждой платформе отдельно. В StackOverflow и Google есть много подобных вопросов, которые могут вам помочь.

Для Android: проверьте ваши стили. xml в разделе Ресурсы -> значения выглядят как <item name="android:statusBarColor">#000000</item> для установите цвет

для iOS: в вашем AppDelegate.cs найдите FinishedLaunsching -метод. Вы можете изменить стиль с помощью UIApplication.SharedApplication.SetStatusBarStyle(UIStatusBarStyle.DarkContent, false);

...