iOS 动态类型 - 设置最小字体大小

iOS dynamic type - set minimum font size

我绝对希望在 iOS 应用程序中尽可能多地使用动态类型 - 我喜欢这样的想法,即用户可以选择他们喜欢的任何大小。

然而,当字体大小设置为一些较低的值时,应用程序最终看起来非常荒谬,一侧的文本很小,整个负载都是白色 space。就个人而言,我将我的 phone 设置为最小的字体(它似乎非常适合消息和电子邮件),但我会在这个应用程序中导致的布局犹豫不决。 (由于图像的固定大小,无法为较小的字体固定此布局。)

简而言之,我正在寻找一种方法来为正文或特定标签设置最小字体大小,而不管动态类型是什么,或者是一种阻止某些动态类型级别的方法。

试试这个来设置支持动态类型的标签的最小字体大小。

在Viewdidload方法中-

NotificationCenter.default.addObserver(self, selector: #selector(self.handleDynamicTypeChange), name: NSNotification.Name.UIContentSizeCategoryDidChange, object: nil)

在处理程序方法中 -

func handleDynamicTypeChange() {
    print("size category changed to --->\(UIApplication.shared.preferredContentSizeCategory)")

    if (UIApplication.shared.preferredContentSizeCategory) == UIContentSizeCategory(rawValue: "UICTContentSizeCategoryXS") || (UIApplication.shared.preferredContentSizeCategory) == UIContentSizeCategory(rawValue: "UICTContentSizeCategoryS") {
        dynamicLabel?.font.withSize(12.0)
    }
    else {
        dynamicLabel?.font = UIFont.preferredFont(forTextStyle: .body)
    }
}

Dynamic Type 功能与文本样式一起使用 (自 iOS 11 以来有 11 种可能的选择) 用于强调某些易读内容的重要性或只是构建演示文稿。

在我看来,从一种特定字体大小到另一种字体大小的 type size values suggested by Apple may be customized but their size variation 应该保留并由系统处理。

设置最小字体大小的问题在于,根据文本样式的目的。 设置最小字体大小意味着通过仅定义默认字体 (大尺寸) 来为每种文本样式执行此操作,它将根据上面的变体解释自动提供可用的最小尺寸。

但是,如果您确实想要施加最小尺寸,请遵循@KrishnaDattShukla 的解决方案(在这种情况下也应实施添加文本样式区分)customize your font 让系统工作。注意新的字体大小值,以免在特定的文本大小下,不太重要的文本样式比更重要的文本样式大……例如,Caption1 文本样式的大小范围约为 3.9× , 而 LargeTitle 仅为 1.8× !!!

除了像@Krishna Datt Shukla 使用的那样添加通知,您还可以在视图或 ViewController:

中覆盖 traitCollectionDidChange
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
   if traitCollection.preferredContentSizeCategory < .small {
       dynamicLabel.font = dynamicLabel.font.withSize(15)
    } else {
       // setup your font again
    }
}

请注意,Accessibility Inspector 会误导这些通知,因此最好使用控制中心或模拟器设置在设备中进行测试。

在 SwiftUI 中 (iOS 14.0)

为了避免使用动态类型和可访问性文本功能使用非常小的字体,可以使用 minimumScaleFactor 修饰符,其工作方式如下:

struct ContentView: View {
   
    var body: some View {
       Text("Hello World")
         .minimumScaleFactor(0.5)
    }
}

这将避免在使用动态类型时过度缩放文本。在此示例中,如果在 minimumScaleFactor 修饰符中使用值 0.5,文本不应小于其通常大小的一半。