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

Posted

技术标签:

【中文标题】iOS 动态类型 - 设置最小字体大小【英文标题】:iOS dynamic type - set minimum font size 【发布时间】:2017-01-19 17:15:25 【问题描述】:

我肯定希望在 ios 应用程序中尽可能多地使用动态类型 - 我喜欢用户可以选择他们喜欢的任何大小的想法。

但是,当字体大小设置为某些较低的值时,应用程序最终看起来非常荒谬,一侧的文字很小,并且有一大堆空白。就个人而言,我将手机设置为最小的字体(它似乎非常适合消息和电子邮件),但我对这个应用程序中的布局犹豫不决。 (由于图像的大小固定,因此无法针对较小的字体修复此布局。)

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

【问题讨论】:

您可以为要符合动态字体大小的对象分配属性或标签,并检查该值以确定哪些对象将使用动态字体大小 【参考方案1】:

尝试为支持动态类型的标签设置最小字体大小。

在 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)
    

【讨论】:

【参考方案2】:

Dynamic Type 功能适用于文本样式(自 iOS 11 以来有 11 种可能的选择),用于强调某些清晰内容的重要性或仅用于构建演示文稿。

type size values suggested by Apple 可以自定义,但在我看来,它们的 size variation 从一种特定类型大小到另一种类型大小应保留并由系统处理。

设置最小字体大小的问题在于,根据文本样式用途的定义,每个文本样式都不能相同。 设置最小字体大小意味着通过仅定义默认的 (大尺寸) 为每种文本样式执行此操作,该默认值将根据上述变体说明自动提供可用的最小尺寸。

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

【讨论】:

【参考方案3】:

您也可以在 View 或 ViewController 中覆盖 traitCollectionDidChange,而不是像 @Krishna Datt Shukla 那样添加通知:

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

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

【讨论】:

【参考方案4】:

在 SwiftUI (iOS 14.0) 中

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

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

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

【讨论】:

以上是关于iOS 动态类型 - 设置最小字体大小的主要内容,如果未能解决你的问题,请参考以下文章

如何为 UILabel 设置“粗体”动态字体类型?

如何从 iOS 设置中检测动态字体大小更改?

Xamarin.iOS - 如何动态更改标签字体大小?

使用特定动态类型大小的字体

swift实现动态字体

在 iphone 5 和 iphone 6 中动态设置字体大小