170 lines
6.2 KiB
C#
170 lines
6.2 KiB
C#
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 = "<Pending>")]
|
|
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();
|
|
}
|
|
|
|
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 = "<Pending>")]
|
|
public Task Transition(IShellItemRenderer oldRenderer, IShellItemRenderer newRenderer)
|
|
{
|
|
var task = new TaskCompletionSource<bool>();
|
|
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 = "<Pending>")]
|
|
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);
|
|
}
|
|
}
|
|
}
|