79 lines
2.9 KiB
C#
79 lines
2.9 KiB
C#
#if IOS
|
|
|
|
using Microsoft.Maui.Handlers;
|
|
using UIKit;
|
|
|
|
namespace gehGassi.Toolkit.Extensions.Window
|
|
{
|
|
public static partial class WindowExtensions
|
|
{
|
|
private const string DisplayContentBehindBarsKey = "DisplayContentBehindBars";
|
|
private const string InsetsKey = "Insets";
|
|
|
|
/// <summary>
|
|
/// Forces application content to be displayed behind system bars (status and navigation bars) on Android and iOS.
|
|
/// </summary>
|
|
/// <param name="builder">The builder for your .NET MAUI application and services.</param>
|
|
/// <returns>The builder.</returns>
|
|
public static MauiAppBuilder DisplayContentBehindBars(this MauiAppBuilder builder)
|
|
{
|
|
LayoutHandler.Mapper.PrependToMapping(DisplayContentBehindBarsKey, (handler, layout) =>
|
|
{
|
|
if (layout is Layout realLayout)
|
|
realLayout.IgnoreSafeArea = true;
|
|
});
|
|
|
|
PageHandler.Mapper.PrependToMapping(DisplayContentBehindBarsKey, (handler, page) =>
|
|
{
|
|
if (page is BindableObject bindablePage)
|
|
Microsoft.Maui.Controls.PlatformConfiguration.iOSSpecific.Page.SetUseSafeArea(bindablePage, false);
|
|
});
|
|
|
|
WindowHandler.Mapper.AppendToMapping(InsetsKey, (handler, window) =>
|
|
{
|
|
if (window is not Element elementWindow)
|
|
return;
|
|
|
|
if (!safeAreas.ContainsKey(elementWindow.Id))
|
|
safeAreas[elementWindow.Id] = GetInsets(window);
|
|
|
|
if (window is not Microsoft.Maui.Controls.Window realWindow)
|
|
return;
|
|
|
|
DeviceDisplay.Current.MainDisplayInfoChanged += DeviceDisplayMainDisplayInfoChanged;
|
|
realWindow.Destroying += WindowExtensionsDestroying;
|
|
});
|
|
|
|
return builder;
|
|
}
|
|
|
|
private static void WindowExtensionsDestroying(object sender, EventArgs e)
|
|
{
|
|
var window = sender as Microsoft.Maui.Controls.Window;
|
|
|
|
window.Destroying -= WindowExtensionsDestroying;
|
|
DeviceDisplay.Current.MainDisplayInfoChanged -= DeviceDisplayMainDisplayInfoChanged;
|
|
}
|
|
|
|
private static void DeviceDisplayMainDisplayInfoChanged(object sender, DisplayInfoChangedEventArgs e)
|
|
{
|
|
foreach (var key in safeAreas.Keys)
|
|
{
|
|
var window = Application.Current.Windows.FirstOrDefault(w => w.Id == key);
|
|
|
|
InvokeListenersIfChanged(key, GetInsets(window));
|
|
}
|
|
}
|
|
|
|
private static Thickness GetInsets(IWindow window)
|
|
{
|
|
if (window is null)
|
|
return new Thickness(0);
|
|
|
|
var uiWindow = window.Handler.PlatformView as UIWindow;
|
|
return new Thickness(uiWindow.SafeAreaInsets.Left, uiWindow.SafeAreaInsets.Top, uiWindow.SafeAreaInsets.Right, uiWindow.SafeAreaInsets.Bottom);
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif |