首页 > 解决方案 > 你如何使 UISegmentedControl 遵循动态类型?

问题描述

我已经开始将动态类型和首选字体应用到我的应用程序中。视图控制器中唯一不符合的部分是一对分段控制器,当标签等都在设置中使用较大的文本滑块展开时,它们会保持很小的状态。

标签: accessibilityuisegmentedcontrol

解决方案


截至 2018 年 10 月,它似乎UILabel是唯一具有内置可访问性的动态更新行为的类,以adjustsFontForContentSizeCategory布尔标志的形式。如果将此标志设置为trueon a UILabel,并为标签设置动态类型字体,则标签将根据当前内容大小设置动态调整自身(及其自身框架)的大小。这也适用于UIButton内部UILabel用于显示文本的东西。

不幸的是,对于像这样的控件UISegmentedControl,似乎没有可以打开或关闭的布尔标志。这是我实现它的方法:

在您设置视图中viewDidLoadawakeFromNib之后,您想要注册内容大小更改通知:

NotificationCenter.default.addObserver(self,
                                               selector:#selector(userChangedTextSize(notification:)),
                                               name: UIContentSizeCategory.didChangeNotification,
                                               object: nil)

现在在userChangedTextSize方法中,您要重置分段控件上的字体:

 @objc private func userChangedTextSize(notification: Notification) {
    // Replace textStyle with whatever textStyle you want for your segmented control
    segmentedControl.setTitleTextAttributes([
                .font: UIFont.preferredFont(forTextStyle: textStyle)
                ], for: UIControl.State())
}

推荐阅读