如何使MasterDetailPage图标VoiceOver可访问?

时间:2017-09-06 07:41:19

标签: ios xaml xamarin.forms accessibility voiceover

我的Xamarin.Forms应用程序的主页面包含一个MasterDetailPage,如下所示:

<MasterDetailPage ...>
    <MasterDetailPage.Master>
        <v:MasterMenuPage Title="Menu" Icon="icon_hamburger.png" />
    </MasterDetailPage.Master>
    <MasterDetailPage.Detail>
        ...
    </MasterDetailPage.Detail>
</MasterDetailPage>

当我在iOS 10上尝试“聆听”我的应用并激活了VoiceOver时,我注意到语音将菜单图标显示为Icon Hamburger而不是Menu

如何设置辅助功能文本以克服此问题?

2 个答案:

答案 0 :(得分:1)

从查看Xamarin.Forms源代码,以及它如何创建该导航项。我认为您能够为该图标设置辅助功能标签的唯一方法是为NavigationPage创建自定义渲染器。

此示例为我正确设置标签。

[assembly: ExportRenderer(typeof(NavigationPage), typeof(stackoverflowexample.iOS.CustomNavigationPageRenderer))]
namespace stackoverflowexample.iOS
{
    public class CustomNavigationPageRenderer : NavigationRenderer
    {
        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {
            base.OnElementChanged(e);

            var button = GetNavigationButton();

            if (button == null) return;

            button.AccessibilityLabel = GetMasterPageTitle();

        }

        UIBarButtonItem GetNavigationButton()
        {
            var nav = this.NativeView.Subviews.OfType<UINavigationBar>().FirstOrDefault();

            var navItem = nav.Items.FirstOrDefault(x => x.LeftBarButtonItem != null);

            return navItem?.LeftBarButtonItem;
        }

        string GetMasterPageTitle()
        {
            var parentPages = ((Page)Element).GetParentPages();
            var masterDetail = parentPages.OfType<MasterDetailPage>().FirstOrDefault();

            return masterDetail?.Master?.Title;
        }
    }
}

答案 1 :(得分:0)