【问题标题】:How do you make a UISegmentedControl follow dynamic type?你如何让 UISegmentedControl 遵循动态类型?
【发布时间】:2020-10-25 20:11:49
【问题描述】:

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

【问题讨论】:

    标签: accessibility uisegmentedcontrol


    【解决方案1】:

    截至 2018 年 10 月,UILabel 似乎是唯一具有内置可访问性动态更新行为的类,其形式为 adjustsFontForContentSizeCategory 布尔标志。如果在UILabel 上将此标志设置为true,并为标签设置动态类型字体,则标签将根据当前内容大小设置动态调整自身(及其自身框架)的大小。这也适用于 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())
    }
    

    【讨论】:

      【解决方案2】:

      在 UIKit 14 中,唯一支持“动态类型”功能的组件是

      • UILabel
      • UITextField
      • UITextview

      作为 UINavigationBar、UIBarButtonItem 和 UITableViewCell 一部分的 UILabel 也使用开箱即用的 Dynamic 类型。

      仍然缺少该功能的 UIKit 组件有:

      • 用户界面按钮
      • UISegementedControl

      【讨论】:

      • 你可以设置一个按钮,因为你可以通过button.titleLabel.adjustsFontForContentSizeCategory访问标签
      猜你喜欢
      • 2010-09-09
      • 2017-03-18
      • 2011-03-08
      • 2020-08-21
      • 2010-09-10
      • 2014-02-25
      • 1970-01-01
      • 2011-04-19
      • 1970-01-01
      相关资源
      最近更新 更多