using System.Diagnostics.CodeAnalysis; using System.Threading.Tasks; using Pixiview.iOS.Renderers; using Pixiview.iOS.Renderers.AppShellSection; using Pixiview.Utils; using UIKit; using Xamarin.Forms; using Xamarin.Forms.Platform.iOS; [assembly: ExportRenderer(typeof(Shell), typeof(AppShellRenderer))] namespace Pixiview.iOS.Renderers { public class AppShellRenderer : ShellRenderer { public override bool PrefersHomeIndicatorAutoHidden => Screen.GetHomeIndicatorAutoHidden(Element); protected override IShellSectionRenderer CreateShellSectionRenderer(ShellSection shellSection) { var renderer = new AppShellSectionRenderer(this); if (renderer is ShellSectionRenderer sr && Element is AppShell shell) { shell.SetNavigationBarHeight( sr.NavigationBar.Frame.Height, UIApplication.SharedApplication.StatusBarFrame.Height); } return renderer; } [SuppressMessage("Code Notifications", "XI0002:Notifies you from using newer Apple APIs when targeting an older OS version", Justification = "")] protected override IShellItemRenderer CreateShellItemRenderer(ShellItem item) { var renderer = base.CreateShellItemRenderer(item); if (UIDevice.CurrentDevice.CheckSystemVersion(13, 0)) { if (renderer.ViewController is UITabBarController controller) { var tabBar = controller.TabBar; tabBar.TintColor = UIColor.LabelColor; tabBar.UnselectedItemTintColor = UIColor.SecondaryLabelColor; } } return renderer; } protected override IShellItemTransition CreateShellItemTransition() { return new AppShellItemTransition(); } protected override IShellTabBarAppearanceTracker CreateTabBarAppearanceTracker() { return new AppShellTabBarAppearanceTracker(); } } public class AppShellItemTransition : IShellItemTransition { [SuppressMessage("Code Notifications", "XI0001:Notifies you with advices on how to use Apple APIs", Justification = "")] public Task Transition(IShellItemRenderer oldRenderer, IShellItemRenderer newRenderer) { var task = new TaskCompletionSource(); var oldView = oldRenderer.ViewController.View; var newView = newRenderer.ViewController.View; newView.Alpha = 0; newView.Superview.InsertSubviewAbove(newView, oldView); UIView.Animate(0.2, 0, UIViewAnimationOptions.BeginFromCurrentState, () => newView.Alpha = 1, () => task.TrySetResult(true)); return task.Task; } } public class AppShellTabBarAppearanceTracker : IShellTabBarAppearanceTracker { UIColor _defaultBarTint; UIColor _defaultTint; UIColor _defaultUnselectedTint; public void Dispose() { } public void ResetAppearance(UITabBarController controller) { if (_defaultTint == null) return; var tabBar = controller.TabBar; tabBar.BarTintColor = _defaultBarTint; tabBar.TintColor = _defaultTint; tabBar.UnselectedItemTintColor = _defaultUnselectedTint; } [SuppressMessage("Code Notifications", "XI0002:Notifies you from using newer Apple APIs when targeting an older OS version", Justification = "")] 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; //bool operatingSystemSupportsUnselectedTint = Forms.IsiOS10OrNewer; if (_defaultTint == null) { _defaultBarTint = tabBar.BarTintColor; _defaultTint = tabBar.TintColor; //if (operatingSystemSupportsUnselectedTint) { _defaultUnselectedTint = tabBar.UnselectedItemTintColor; } } //if (!backgroundColor.IsDefault) // tabBar.BarTintColor = backgroundColor.ToUIColor(); if (!tintColor.IsDefault) tabBar.TintColor = tintColor.ToUIColor(); //if (operatingSystemSupportsUnselectedTint) { if (UIDevice.CurrentDevice.CheckSystemVersion(13, 0)) { //tabBar.UnselectedItemTintColor = UIColor.TertiaryLabelColor; } else { if (!unselectedColor.IsDefault) tabBar.UnselectedItemTintColor = unselectedColor.ToUIColor(); } } } public void UpdateLayout(UITabBarController controller) { } } public class AppShellSectionRenderer : ShellSectionRenderer { public AppShellSectionRenderer(IShellContext context) : base(context) { } protected override IShellSectionRootRenderer CreateShellSectionRootRenderer(ShellSection shellSection, IShellContext shellContext) { return new AppShellSectionRootRenderer(shellSection, shellContext); } } public class AppShellSectionRootRenderer : ShellSectionRootRenderer { public AppShellSectionRootRenderer(ShellSection shellSection, IShellContext shellContext) : base(shellSection, shellContext) { } protected override IShellSectionRootHeader CreateShellSectionRootHeader(IShellContext shellContext) { return new AppShellSectionRootHeader(shellContext); } } }