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 = base.CreateShellSectionRenderer(shellSection); // new AppShellSectionRenderer(this); if (renderer is ShellSectionRenderer sr && Element is AppShell shell) { shell.SetNavigationBarHeight(sr.NavigationBar.Frame.Height); shell.SetStatusBarHeight( sr.NavigationBar.Frame.Height, UIApplication.SharedApplication.StatusBarFrame.Height); } return renderer; } protected override IShellItemTransition CreateShellItemTransition() { return new AppShellItemTransition(); } protected override IShellTabBarAppearanceTracker CreateTabBarAppearanceTracker() { return new AppShellTabBarAppearanceTracker(); } protected override IShellNavBarAppearanceTracker CreateNavBarAppearanceTracker() { return new AppShellNavBarAppearanceTracker(); } protected override void UpdateBackgroundColor() { NativeView.BackgroundColor = Color.Transparent.ToUIColor(); } } 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 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); } } }