From feb15710aa5040fc74236936323f3473e856b950 Mon Sep 17 00:00:00 2001 From: Jakub Florkowski Date: Sun, 12 Jan 2025 12:35:34 +0100 Subject: [PATCH 1/7] [iOS] Improve status bar --- .../Behaviors/StatusBarBehaviorPage.xaml | 2 + .../Platform/StatusBar/StatusBar.ios.cs | 17 +++++- .../StatusBar/StatusBarBehavior.shared.cs | 6 +- .../iOSSpecific/StatusBar.cs | 59 +++++++++++++++++++ 4 files changed, 80 insertions(+), 4 deletions(-) create mode 100644 src/CommunityToolkit.Maui/PlatformConfiguration/iOSSpecific/StatusBar.cs diff --git a/samples/CommunityToolkit.Maui.Sample/Pages/Behaviors/StatusBarBehaviorPage.xaml b/samples/CommunityToolkit.Maui.Sample/Pages/Behaviors/StatusBarBehaviorPage.xaml index f86bf5f884..50a07c6163 100644 --- a/samples/CommunityToolkit.Maui.Sample/Pages/Behaviors/StatusBarBehaviorPage.xaml +++ b/samples/CommunityToolkit.Maui.Sample/Pages/Behaviors/StatusBarBehaviorPage.xaml @@ -6,6 +6,8 @@ xmlns:mct="http://schemas.microsoft.com/dotnet/2022/maui/toolkit" xmlns:pages="clr-namespace:CommunityToolkit.Maui.Sample.Pages" xmlns:vm="clr-namespace:CommunityToolkit.Maui.Sample.ViewModels.Behaviors" + xmlns:ios="clr-namespace:CommunityToolkit.Maui.PlatformConfiguration.iOSSpecific;assembly=CommunityToolkit.Maui" + ios:StatusBar.UseSafeArea="True" Title="StatusBarBehavior" x:DataType="vm:StatusBarBehaviorViewModel" x:TypeArguments="vm:StatusBarBehaviorViewModel" diff --git a/src/CommunityToolkit.Maui.Core/Platform/StatusBar/StatusBar.ios.cs b/src/CommunityToolkit.Maui.Core/Platform/StatusBar/StatusBar.ios.cs index a4403260aa..72d45f983b 100644 --- a/src/CommunityToolkit.Maui.Core/Platform/StatusBar/StatusBar.ios.cs +++ b/src/CommunityToolkit.Maui.Core/Platform/StatusBar/StatusBar.ios.cs @@ -11,7 +11,7 @@ static partial class StatusBar /// /// Method to update the status bar size. /// - public static void UpdateBarSize() + public static void UpdateBarSize(bool useSafeArea) { if (OperatingSystem.IsIOSVersionAtLeast(13)) { @@ -27,7 +27,14 @@ public static void UpdateBarSize() statusBar ??= new UIView(statusBarFrame.Value); statusBar.Tag = statusBarTag; - statusBar.Frame = UIApplication.SharedApplication.StatusBarFrame; + if (useSafeArea) + { + statusBar.Frame = new CGRect(statusBar.Frame.X, statusBar.Frame.Y, statusBar.Frame.Width, window.SafeAreaInsets.Top); + } + else + { + statusBar.Frame = UIApplication.SharedApplication.StatusBarFrame; + } var statusBarSubViews = window.Subviews.Where(x => x.Tag == statusBarTag).ToList(); foreach (var statusBarSubView in statusBarSubViews) { @@ -68,11 +75,15 @@ static void PlatformSetColor(Color color) // ReSharper disable once NullCoalescingConditionIsAlwaysNotNullAccordingToAPIContract // window.ViewWithTag(tag) can return null + var statusBarSize = statusBar?.Frame.Size; statusBar ??= new UIView(statusBarFrame.Value); statusBar.Tag = statusBarTag; statusBar.BackgroundColor = uiColor; statusBar.TintColor = uiColor; - statusBar.Frame = UIApplication.SharedApplication.StatusBarFrame; + if (statusBarSize is null) + { + statusBar.Frame = new CGRect(statusBar.Frame.X, statusBar.Frame.Y, statusBar.Frame.Width, window.SafeAreaInsets.Top); + } var statusBarSubViews = window.Subviews.Where(x => x.Tag == statusBarTag).ToList(); foreach (var statusBarSubView in statusBarSubViews) { diff --git a/src/CommunityToolkit.Maui/Behaviors/PlatformBehaviors/StatusBar/StatusBarBehavior.shared.cs b/src/CommunityToolkit.Maui/Behaviors/PlatformBehaviors/StatusBar/StatusBarBehavior.shared.cs index 507af7c4c1..85bcfc84b6 100644 --- a/src/CommunityToolkit.Maui/Behaviors/PlatformBehaviors/StatusBar/StatusBarBehavior.shared.cs +++ b/src/CommunityToolkit.Maui/Behaviors/PlatformBehaviors/StatusBar/StatusBarBehavior.shared.cs @@ -119,7 +119,11 @@ protected override void OnDetachedFrom(Page bindable, object platformView) #if IOS static void OnPageSizeChanged(object? sender, EventArgs e) { - StatusBar.UpdateBarSize(); + if(sender is not Page page) + { + return; + } + StatusBar.UpdateBarSize(PlatformConfiguration.iOSSpecific.StatusBar.GetUseSafeArea(page)); } #endif diff --git a/src/CommunityToolkit.Maui/PlatformConfiguration/iOSSpecific/StatusBar.cs b/src/CommunityToolkit.Maui/PlatformConfiguration/iOSSpecific/StatusBar.cs new file mode 100644 index 0000000000..d5ae302688 --- /dev/null +++ b/src/CommunityToolkit.Maui/PlatformConfiguration/iOSSpecific/StatusBar.cs @@ -0,0 +1,59 @@ +using System.Runtime.Versioning; +using MiOS = Microsoft.Maui.Controls.PlatformConfiguration.iOS; +using MauiElement = Microsoft.Maui.Controls.Page; + +namespace CommunityToolkit.Maui.PlatformConfiguration.iOSSpecific; + +/// +/// Provides platform-specific configuration properties for the iOS StatusBar bar. +/// +[SupportedOSPlatform("ios")] +public static class StatusBar +{ + /// + /// Identifies the UseSafeArea bindable property. + /// + public static readonly BindableProperty UseSafeAreaProperty = BindableProperty.CreateAttached("UseSafeArea", typeof(bool), typeof(StatusBar), true); + + /// + /// Gets the UseSafeArea of the navigation bar. + /// + /// The bindable object. + /// The UseSafeArea value. + public static bool GetUseSafeArea(BindableObject element) + { + return (bool)element.GetValue(UseSafeAreaProperty); + } + + /// + /// Sets the UseSafeArea of the navigation bar. + /// + /// The bindable object. + /// The UseSafeArea to set. + public static void SetUseSafeArea(BindableObject element, bool value) + { + element.SetValue(UseSafeAreaProperty, value); + } + + /// + /// Sets the UseSafeArea of the navigation bar. + /// + /// The platform element configuration. + /// The UseSafeArea to set. + /// The platform element configuration. + public static IPlatformElementConfiguration SetUseSafeArea(this IPlatformElementConfiguration config, bool value) + { + SetUseSafeArea(config.Element, value); + return config; + } + + /// + /// Gets the UseSafeArea of the navigation bar. + /// + /// The platform element configuration. + /// The UseSafeArea value + public static bool GetUseSafeArea(this IPlatformElementConfiguration config) + { + return GetUseSafeArea(config.Element); + } +} \ No newline at end of file From a5da5b110c6894cd370ca13e9520aa5e0385443a Mon Sep 17 00:00:00 2001 From: Brandon Minnick <13558917+brminnick@users.noreply.github.com> Date: Thu, 16 Jan 2025 12:15:45 -0800 Subject: [PATCH 2/7] Use `Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.GetUseSafeArea`, Remove `CommunityToolkit.Maui.PlatformConfiguration.iOSSpecific.StatusBar`, Remove `OperatingSystem.IsIOSVersionAtLeast(13))` (Toolkit now supports iOS 15+) --- .../Pages/Base/BasePage.cs | 7 +-- .../Behaviors/StatusBarBehaviorPage.xaml | 6 +- .../Platform/StatusBar/StatusBar.ios.cs | 55 +++++++---------- .../StatusBar/StatusBarBehavior.shared.cs | 35 +++++------ .../iOSSpecific/StatusBar.cs | 59 ------------------- 5 files changed, 43 insertions(+), 119 deletions(-) delete mode 100644 src/CommunityToolkit.Maui/PlatformConfiguration/iOSSpecific/StatusBar.cs diff --git a/samples/CommunityToolkit.Maui.Sample/Pages/Base/BasePage.cs b/samples/CommunityToolkit.Maui.Sample/Pages/Base/BasePage.cs index e659b1568e..c88679bddc 100644 --- a/samples/CommunityToolkit.Maui.Sample/Pages/Base/BasePage.cs +++ b/samples/CommunityToolkit.Maui.Sample/Pages/Base/BasePage.cs @@ -3,12 +3,9 @@ namespace CommunityToolkit.Maui.Sample.Pages; -public abstract class BasePage : BasePage where TViewModel : BaseViewModel +public abstract class BasePage(TViewModel viewModel) : BasePage(viewModel) + where TViewModel : BaseViewModel { - protected BasePage(TViewModel viewModel) : base(viewModel) - { - } - public new TViewModel BindingContext => (TViewModel)base.BindingContext; } diff --git a/samples/CommunityToolkit.Maui.Sample/Pages/Behaviors/StatusBarBehaviorPage.xaml b/samples/CommunityToolkit.Maui.Sample/Pages/Behaviors/StatusBarBehaviorPage.xaml index 50a07c6163..7698437c54 100644 --- a/samples/CommunityToolkit.Maui.Sample/Pages/Behaviors/StatusBarBehaviorPage.xaml +++ b/samples/CommunityToolkit.Maui.Sample/Pages/Behaviors/StatusBarBehaviorPage.xaml @@ -6,8 +6,8 @@ xmlns:mct="http://schemas.microsoft.com/dotnet/2022/maui/toolkit" xmlns:pages="clr-namespace:CommunityToolkit.Maui.Sample.Pages" xmlns:vm="clr-namespace:CommunityToolkit.Maui.Sample.ViewModels.Behaviors" - xmlns:ios="clr-namespace:CommunityToolkit.Maui.PlatformConfiguration.iOSSpecific;assembly=CommunityToolkit.Maui" - ios:StatusBar.UseSafeArea="True" + xmlns:ios="clr-namespace:Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific;assembly=Microsoft.Maui.Controls" + ios:Page.UseSafeArea="True" Title="StatusBarBehavior" x:DataType="vm:StatusBarBehaviorViewModel" x:TypeArguments="vm:StatusBarBehaviorViewModel" @@ -83,7 +83,7 @@ - +