From b6e7db6ecfb094797f7d17cafdd835a75a8ffe3f Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Tue, 11 Jun 2019 20:57:12 -0400 Subject: [PATCH] custom content page renderer for left nav items --- .../Renderers/CustomContentPageRenderer.cs | 56 +++++++++++++++++++ src/iOS/iOS.csproj | 1 + 2 files changed, 57 insertions(+) create mode 100644 src/iOS/Renderers/CustomContentPageRenderer.cs diff --git a/src/iOS/Renderers/CustomContentPageRenderer.cs b/src/iOS/Renderers/CustomContentPageRenderer.cs new file mode 100644 index 000000000..85f1f5887 --- /dev/null +++ b/src/iOS/Renderers/CustomContentPageRenderer.cs @@ -0,0 +1,56 @@ +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using Bit.iOS.Renderers; +using UIKit; +using Xamarin.Forms; +using Xamarin.Forms.Platform.iOS; + +[assembly: ExportRenderer(typeof(ContentPage), typeof(CustomContentPageRenderer))] +namespace Bit.iOS.Renderers +{ + public class CustomContentPageRenderer : PageRenderer + { + public override void ViewWillAppear(bool animated) + { + base.ViewWillAppear(animated); + if(!(Element is ContentPage contentPage) || NavigationController == null) + { + return; + } + + var navigationItem = NavigationController.TopViewController.NavigationItem; + var leftNativeButtons = (navigationItem.LeftBarButtonItems ?? new UIBarButtonItem[] { }).ToList(); + var rightNativeButtons = (navigationItem.RightBarButtonItems ?? new UIBarButtonItem[] { }).ToList(); + var newLeftButtons = new List(); + var newRightButtons = new List(); + foreach(var nativeItem in rightNativeButtons) + { + // Use reflection to get Xamarin private field "_item" + var field = nativeItem.GetType().GetField("_item", BindingFlags.NonPublic | BindingFlags.Instance); + if(field == null) + { + return; + } + if(!(field.GetValue(nativeItem) is ToolbarItem info)) + { + return; + } + if(info.Priority < 0) + { + newLeftButtons.Add(nativeItem); + } + else + { + newRightButtons.Add(nativeItem); + } + } + foreach(var nativeItem in leftNativeButtons) + { + newLeftButtons.Add(nativeItem); + } + navigationItem.RightBarButtonItems = newRightButtons.ToArray(); + navigationItem.LeftBarButtonItems = newLeftButtons.ToArray(); + } + } +} diff --git a/src/iOS/iOS.csproj b/src/iOS/iOS.csproj index 309cf6ead..11599996a 100644 --- a/src/iOS/iOS.csproj +++ b/src/iOS/iOS.csproj @@ -112,6 +112,7 @@ +