Xamarin.Forms: пользовательский интерфейс не отображается одинаково на iOS 10.1 и iOS 10.4 - PullRequest
0 голосов
/ 05 июля 2018

Я работаю в приложении Xamarin.Forms , где мне нужно реализовать прозрачную / полупрозрачную панель навигации .

Я изучил Vision Conference образец , где это реализовано.

Это достигается с помощью CustomNavigationPage и CustomRenderer.

XAML из CustomNavigationPage:

<?xml version="1.0" encoding="utf-8" ?>
<NavigationPage 
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    x:Class="ConferenceVision.Views.CustomNavigationPage"
    xmlns:iOS="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core"
    iOS:NavigationPage.IsNavigationBarTranslucent="True"
    BarTextColor="{StaticResource NavigationBarTextColor}">
    <NavigationPage.BarBackgroundColor>
        <OnPlatform x:TypeArguments="Color">
            <On Platform="Android, iOS" Value="Transparent" />
            <On Platform="UWP" Value="{StaticResource NavigationBarBackgroundColor}" />
        </OnPlatform>
    </NavigationPage.BarBackgroundColor>
</NavigationPage>

кодовый элемент из CustomNavigationPage:

public partial class CustomNavigationPage : NavigationPage
{
    public bool IgnoreLayoutChange { get; set; } = false;

    protected override void OnSizeAllocated(double width, double height)
    {
        if (!IgnoreLayoutChange)
            base.OnSizeAllocated(width, height);
    }

    public CustomNavigationPage() : base()
    {
        InitializeComponent();
    }

    public CustomNavigationPage(Page root) : base(root)
    {
        InitializeComponent();
    }
}

И CustomRenderer это:

public class CustomNavigationRenderer : NavigationRenderer
{
    public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        UINavigationBar.Appearance.SetBackgroundImage(new UIImage(), UIBarMetrics.Default);
        UINavigationBar.Appearance.ShadowImage = new UIImage();
        UINavigationBar.Appearance.BackgroundColor = UIColor.Clear;
        UINavigationBar.Appearance.TintColor = UIColor.White;
        UINavigationBar.Appearance.BarTintColor = UIColor.Clear;
        UINavigationBar.Appearance.Translucent = true;
        UINavigationBar.Appearance.SetTitleTextAttributes(new UITextAttributes()
        {
            Font = UIFont.FromName("HelveticaNeue-Light", (nfloat)20f),
            TextColor = UIColor.White
        });
    }

    protected override void Dispose(bool disposing)
    {
        if (disposing)
        {
        }

        base.Dispose(disposing);
    }
}

Я тестировал приложение на:

  • симуляторы: iPhone 6 на iOS 11.3
  • мое устройство: iPhone 6 на iOS 10.1

И мы видим, что результаты не совпадают . На симуляторе и iOS 11.3 существует разрыв между панелью навигации и контентом:

screenshot iOS 11.3

Но на моем устройстве под iOS 10.1 пропуска нет, и контент отображается "под" панелью навигации:

screenshot iOS 10.1

Страница построена так, но рендеринг одинаков на всех страницах:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:effects="clr-namespace:ConferenceVision.Effects"
             xmlns:local="clr-namespace:ConferenceVision.Views.Renderers"
             xmlns:ios="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core"              
             ios:Page.UseSafeArea="true"
             Title="About"
             x:Class="ConferenceVision.Views.AboutView">
    <ContentPage.Content>
            <ScrollView>
                <ScrollView.Margin>
                    <OnPlatform x:TypeArguments="Thickness" Default="15,0">
                        <On Platform="Android" Value="15,50,15,0"/>
                    </OnPlatform>
                </ScrollView.Margin>
                ...
            </ScrollView>
    </ContentPage.Content>
</ContentPage>

Как это объяснить? Может ли это быть связано с использованием UseSafeArea? Я знаю, что на моем устройстве установлена ​​«старая» версия, но в моем приложении приходится охватывать наибольшее количество пользователей.

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Это нормально для этой версии. Вы всегда должны использовать последние 3 версии каждой мобильной ОС, поскольку их рыночная доля обеспечивает лучшую стабильность, совместимость и признание со стороны общественности.

Это цифры для 10,1 в мире (от NetMarketshare )

enter image description here

Просто попросите пользователей использовать более обновленную версию.

0 голосов
/ 06 июля 2018

Разница между iOS связана с использованием SafeArea. В iOS 11+ Safearea добавляет paddind.

ios:Page.UseSafeArea="true"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...