using System.Linq; using CoreGraphics; using UIKit; using Xamarin.Forms; using Xamarin.Forms.Platform.iOS; namespace Pixiview.iOS.Renderers.AppShellSection { public class AppShellNavBarAppearanceTracker : IShellNavBarAppearanceTracker { UIColor _defaultBarTint; UIColor _defaultTint; UIStringAttributes _defaultTitleAttributes; float _shadowOpacity = float.MinValue; CGColor _shadowColor; public void ResetAppearance(UINavigationController controller) { if (_defaultTint != null) { var navBar = controller.NavigationBar; navBar.TintColor = _defaultBarTint; navBar.TintColor = _defaultTint; navBar.TitleTextAttributes = _defaultTitleAttributes; } } public void SetAppearance(UINavigationController controller, ShellAppearance appearance) { var background = appearance.BackgroundColor; var foreground = appearance.ForegroundColor; var titleColor = appearance.TitleColor; var navBar = controller.NavigationBar; if (_defaultTint == null) { _defaultBarTint = navBar.BarTintColor; _defaultTint = navBar.TintColor; _defaultTitleAttributes = navBar.TitleTextAttributes; } if (UIDevice.CurrentDevice.CheckSystemVersion(13, 0)) { navBar.TintColor = UIColor.SecondaryLabelColor; } else { if (!background.IsDefault) navBar.BarTintColor = background.ToUIColor(); if (!foreground.IsDefault) navBar.TintColor = foreground.ToUIColor(); if (!titleColor.IsDefault) { navBar.TitleTextAttributes = new UIStringAttributes { ForegroundColor = titleColor.ToUIColor() }; } } } public void SetHasShadow(UINavigationController controller, bool hasShadow) { var navigationBar = controller.NavigationBar; if (_shadowOpacity == float.MinValue) { // Don't do anything if user hasn't changed the shadow to true if (!hasShadow) return; _shadowOpacity = navigationBar.Layer.ShadowOpacity; _shadowColor = navigationBar.Layer.ShadowColor; } if (hasShadow) { navigationBar.Layer.ShadowColor = UIColor.Black.CGColor; navigationBar.Layer.ShadowOpacity = 1.0f; } else { navigationBar.Layer.ShadowColor = _shadowColor; navigationBar.Layer.ShadowOpacity = _shadowOpacity; } } public void Dispose() { } public void UpdateLayout(UINavigationController controller) { } } public class AppShellTabBarAppearanceTracker : IShellTabBarAppearanceTracker { UIColor _defaultBarTint; UIColor _defaultTint; UIColor _defaultUnselectedTint; private readonly AppShell appShell; private bool initIcons; public AppShellTabBarAppearanceTracker(AppShell shell) { appShell = shell; } public void ResetAppearance(UITabBarController controller) { if (_defaultTint == null) return; var tabBar = controller.TabBar; tabBar.BarTintColor = _defaultBarTint; tabBar.TintColor = _defaultTint; tabBar.UnselectedItemTintColor = _defaultUnselectedTint; } public void SetAppearance(UITabBarController controller, ShellAppearance appearance) { IShellAppearanceElement appearanceElement = appearance; var backgroundColor = appearanceElement.EffectiveTabBarBackgroundColor; var unselectedColor = appearanceElement.EffectiveTabBarUnselectedColor; var tintColor = appearanceElement.EffectiveTabBarForegroundColor; // appearanceElement.EffectiveTabBarTitleColor; var tabBar = controller.TabBar; if (tabBar.Items != null && !initIcons) { initIcons = true; var sources = appShell.CurrentItem.Items.Select(i => (FontImageSource)i.Icon).ToArray(); var images = new UIImage[sources.Length]; var handler = new FontImageSourceHandler(); for (var i = 0; i < images.Length; i++) { var font = sources[i]; if (font != null) { images[i] = handler.LoadImageAsync(new FontImageSource { FontFamily = "FontAwesome5Pro-Solid", Glyph = font.Glyph, Size = font.Size }).Result; } } for (var i = 0; i < tabBar.Items.Length; i++) { var image = images[i]; if (image != null) { tabBar.Items[i].SelectedImage = image; } } } if (_defaultTint == null) { _defaultBarTint = tabBar.BarTintColor; _defaultTint = tabBar.TintColor; _defaultUnselectedTint = tabBar.UnselectedItemTintColor; } if (UIDevice.CurrentDevice.CheckSystemVersion(13, 0)) { tabBar.TintColor = UIColor.LabelColor; //tabBar.UnselectedItemTintColor = UIColor.TertiaryLabelColor; } else { if (!backgroundColor.IsDefault) tabBar.BarTintColor = backgroundColor.ToUIColor(); if (!tintColor.IsDefault) tabBar.TintColor = tintColor.ToUIColor(); if (!unselectedColor.IsDefault) tabBar.UnselectedItemTintColor = unselectedColor.ToUIColor(); } } public void Dispose() { } public void UpdateLayout(UITabBarController controller) { } } }