Частично безопасная зона на Xamarin.Forms - PullRequest
0 голосов
/ 01 марта 2020

У меня есть страница с ListView, которая нуждается в безопасном заполнении области, чтобы шишка iPhone X не обрезала содержимое ListView в альбомной ориентации. Однако нижняя часть ListView не нуждается в заполнении; закругленные нижние углы экрана не мешают.

Страница позволяет заполнять безопасную область, вызывая это из конструктора:

Xamarin.Forms.PlatformConfiguration.iOSSpecific.Page.SetUseSafeArea(On<Xamarin.Forms.PlatformConfiguration.iOS>(), true);

Как сохранить заполнение безопасной области со всех сторон кроме дна? Решение должно работать, даже если пользователь поворачивает ориентацию экрана при использовании страницы.

1 Ответ

0 голосов
/ 02 марта 2020

Безопасная область может быть настроена путем извлечения значения Толщина с помощью метода Page.SafeAreaInsets из пространства имен Xamarin.Forms.PlatformConfiguration.iOSSpecifi c. Затем его можно изменить, как требуется, и повторно назначить свойству Padding в конструкторе страницы или OnAppearing переопределить:

protected override void OnAppearing()
{
    base.OnAppearing();

    var safeInsets = On<iOS>().SafeAreaInsets();
    safeInsets.Bottom = 0;
    safeInsets.Top = 35;
    safeInsets.Left = 35;
    safeInsets.Right = 35;
    Padding = safeInsets;
}

Эффект Portrait :

enter image description here

Эффект Пейзаж :

enter image description here

Если вам нужно настроить SafeAreaInsets при изменении ориентации устройства. Для удобства можно использовать метод OnSizeAllocated .

protected override void OnSizeAllocated(double width, double height)
{
    base.OnSizeAllocated(width, height);
    if (width != this.width || height != this.height)
    {
        this.width = width;
        this.height = height;
        if (width > height)
        {
            Console.WriteLine("Landscape");
            var safeInsets = On<iOS>().SafeAreaInsets();
            safeInsets.Bottom = 0;
            safeInsets.Top = 0;
            safeInsets.Left = 35;
            safeInsets.Right = 35;
            Padding = safeInsets;
        }
        else
        {
            Console.WriteLine("Portrait");
            var safeInsets = On<iOS>().SafeAreaInsets();
            safeInsets.Bottom = 0;
            safeInsets.Top = 35;
            safeInsets.Left = 0;
            safeInsets.Right = 0;
            Padding = safeInsets;
        }
    }
}

========== ======================= Update ========================== ======

Если вам нужно разместить как можно больше и больше устройств, вы можете сделать некоторые суждения о модели телефона (например, iPhone X), ​​чтобы установить размер зоны безопасности по бокам. Кроме того, вы также можете проверить, содержат ли панель навигации или панель вкладок, чтобы изменить размер Thickness. Это должно быть

protected override void OnSizeAllocated(double width, double height)
{
    base.OnSizeAllocated(width, height);
    if (width != this.width || height != this.height)
    {
        this.width = width;
        this.height = height;
        if (width > height)
        {
            Console.WriteLine("Landscape");
            var safeInsets = On<iOS>().SafeAreaInsets();
            // whether is iPhone X
            if (deveiceType.Equals("iPhone X"))
            {
                //whether contain Navigation Bar
                if (ContainNavigationBar) { safeInsets.Top = 44; } else { safeInsets.Top = 0; }
                //whether conatin Tab Bar
                if (ContainTabBar) { safeInsets.Bottom = 34; } else { safeInsets.Bottom = 0; }
            }
            safeInsets.Left = 35;
            safeInsets.Right = 35;
            Padding = safeInsets;
            Padding = safeInsets;
        }
        else
        {
            Console.WriteLine("Portrait");
            var safeInsets = On<iOS>().SafeAreaInsets();
            // whether is iPhone X
            if (deveiceType.Equals("iPhone X"))
            {
                //whether contain Navigation Bar
                if (ContainNavigationBar) { safeInsets.Top = 84; } else { safeInsets.Top = 44; }
                //whether conatin Tab Bar
                if (ContainTabBar) { safeInsets.Bottom = 34; }else{ safeInsets.Bottom = 0; }
            }
            safeInsets.Left = 0;
            safeInsets.Right = 0;
            Padding = safeInsets;
        }
    }
}

Пока Apple не изменит высоту строки состояния в будущем, я не думаю, что будут проблемы с высотами, установленными жестким кодированием.

...