【问题标题】:How Do I Support Accessibility Font Sizes in Xamarin Forms?如何支持 Xamarin 表单中的辅助功能字体大小?
【发布时间】:2016-06-28 03:57:03
【问题描述】:

例如,我的页面上有一个标签:

var label = new Label
{
    Text = "Some text here.",
    LineBreakMode = LineBreakMode.WordWrap,
    FontSize = Device.GetNamedSize(NamedSize.Large, typeof(Label))
};

如何根据用户对字体大小的可访问性设置来增大(或减小)此标签的字体大小?例如,在 iOS 中,您可以在“设置”>“通用”>“辅助功能”>“更大的文本”下为您的设备设置字体大小。我相信 Apple 将其称为“动态文本”,并且几乎是您的应用支持的要求。

这同样适用于我的应用中的其他控件(按钮、条目等)。

我已经在我的 iPhone 上尝试过此设置,但它似乎并没有改变我应用程序中的所有内容。 TableView 部分标题和列表视图单元格之类的东西正在发生变化,但我的标准标签和条目之类的东西没有。

【问题讨论】:

  • 您是否尝试过手机上的设置?不就行了吗?
  • 我已经开启了设置,但是没有用。让我更新一下我的问题。

标签: xamarin xamarin.forms


【解决方案1】:

您需要提供从preferredFontWithTextStyle (C# = UIFont.PreferredFontForTextStyle) 返回的UIFont,因为Xamarin.Forms 不知道标签、按钮、条目等的使用上下文。

所以我为一个客户端所做的是子类化基本渲染器和视图元素,并为这些元素添加一个仅限 iOS 的属性,以便他们可以定义该控件如何开始在 UI 中使用以及何时由 iOS 呈现的上下文这些控件将受到动态文本大小的影响。

iOS 9 中定义了六种动态字体类型:

  • UIICTFontTextStyleBody
  • UIICTFontTextStyleCaption1
  • UIICTFontTextStyleCaption2
  • UIICTFontTextStyle脚注
  • UIICTFontTextStyleHeadline
  • UIICTFontTextStyle 副标题

注意:Xamarin.iOS 没有像 Swift 那样为这些定义常量/枚举(ObjC 也没有定义这些),因此它们作为 NSString 传递,请参见下面的示例。

示例渲染器:

为名为@9​​87654331@ 的标签子类设置UICTFontTextStyleBody

[assembly: ExportRenderer(typeof(BodyLabel), typeof(iOSLabelBodyRenderer))]
namespace Foobar.iOS
{
    public class iOSLabelBodyRenderer : LabelRenderer
    {
        public iOSLabelBodyRenderer() { }

        protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
        {
            base.OnElementChanged(e);
            if (Control != null)
                Control.Font = UIFont.GetPreferredFontForTextStyle(new NSString("UICTFontTextStyleBody"));
        }
    }
}

结果:

注意:从技术上讲,您还应该实现UIContentSizeCategoryDidChangeNotification 通知,以便在用户更改动态字体大小时调整控件大小/使控件无效。

【讨论】:

  • 谢谢。让我玩一下,看看我能想出什么。稍后会更新。
【解决方案2】:

使用@SushiHangover 提供的答案中的信息,我能够为 iOS 实现以下渲染器策略:

为每个要支持动态文本的控件创建一个渲染器。就我而言,这包括标签、按钮和条目。渲染器将​​Control.Font 分配给UIFontDescriptor,并根据分配给Xamarin Forms 控件的NamedSize 调整PointSize 百分比。

例子:

[assembly: ExportRenderer(typeof(Button), typeof(CustomButtonRenderer))]
namespace iOS.Controls
{
    public class CustomButtonRenderer : ButtonRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
        {
            base.OnElementChanged(e);

            var view = e.NewElement as Button;
            if(Control != null && view != null)
            {
                var descriptor = UIFontDescriptor.PreferredBody;
                var pointSize = descriptor.PointSize;

                var size = view.FontSize;
                if(size == Device.GetNamedSize(NamedSize.Large, typeof(Button)))
                {
                    pointSize *= 1.4f;
                }
                else if(size == Device.GetNamedSize(NamedSize.Small, typeof(Button)))
                {
                    pointSize *= .8f;
                }
                else if(size == Device.GetNamedSize(NamedSize.Micro, typeof(Button)))
                {
                    pointSize *= .6f;
                }

                Control.Font = UIFont.FromDescriptor(descriptor, pointSize);
            }
        }
    }
}

您甚至可以通过基于NamedSize.Default 大小的百分比值来动态支持固定字体大小。

例子:

[assembly: ExportRenderer(typeof(Button), typeof(CustomButtonRenderer))]
namespace iOS.Controls
{
    public class CustomButtonRenderer : ButtonRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Button> e)
        {
            base.OnElementChanged(e);

            var view = e.NewElement as Button;
            if(Control != null && view != null)
            {
                var descriptor = UIFontDescriptor.PreferredBody;
                var percent = view.FontSize / Device.GetNamedSize(NamedSize.Default, typeof(Button));

                Control.Font = UIFont.FromDescriptor(descriptor, percent * descriptor.PointSize);
            }
        }
    }
}

作为参考,完整的实现示例可以在这个GitHub project中找到。

【讨论】:

  • 这是一个非常有趣的方法。它尊重最终用户对其自身文本大小的选择,并带来了获得自定义比例比例的可能性。我不得不说谢谢。我是 Xamarin Forms 的新手,或者几乎是新手,而这种集成正是我想要的。我是像素时代的程序员,如果没有你的帮助,有时很难实现非常简单的事情!
【解决方案3】:

对于 iOS,我相信提供了 things have changed in Xamarin.Forms since the earlier answers。如果将 NamedSize value 分配给文本元素的 FontSize 属性,文本现在会放大和缩小,其值是通过 iOS“大文本”设置设置的。

例如,这将产生可访问、可缩放的文本:

<Label
    FontSize="Large"
    LineBreakMode="WordWrap"
    Text="Some text here." />

【讨论】:

  • 可能只是在这里添加“大”不是自动调整字体大小之一。只有 Title、Subtitle、Header、Body 和 Caption 映射到 iOS 'magic' 字体(来自您链接的 PR)。其余的映射到(诚然缩放,只是不是自动的)固定点大小。
  • 这是一个很好的观察:在 PR 之前查看代码,其他尺寸(包括大)确实按照您所说的进行缩放,并且由 Xamarin 以与您的尺寸相同的方式映射'已经提到。我不知道这两组命名字体之间还有其他行为差异吗?
  • 我很想知道当可访问性字体大小增加时,您是否会获得“不关闭应用程序”字体大小更改。我查看了 Xamarin.Forms 存储库,据我了解,它永远不会以这种方式工作。只有在重新加载/刷新视图或关闭并重新启动应用程序时才会更改?
  • 从使用经验来看,一定要重启应用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多