SwiftUI视图修饰符dynamicTypeSize
SwiftUI视图修饰符dynamicTypeSize

SwiftUI视图修饰符dynamicTypeSize

在 SwiftUI 中,dynamicTypeSize(_:) 是一个视图修饰符,用于限制视图支持的 Dynamic Type Sizes(动态类型大小) 范围。通过这个修饰符,可以指定某个视图仅支持某些字体大小,从而为不同的动态字体设置提供更好的适配。

基本语法

.dynamicTypeSize(_ range: ClosedRange<DynamicTypeSize>)

range 是一个范围,指定视图支持的动态类型大小范围。类型为 ClosedRange<DynamicTypeSize>。

可以使用标准大小(例如 .medium … .xxxLarge)或包含辅助功能大小的范围。

使用示例

限制动态类型大小范围

以下代码限制视图只支持从默认大小(.medium)到超大字体(.xxxLarge):

import SwiftUI

struct ContentView: View {
    var body: some View {
        Text("Hello, Dynamic Type!")
            .dynamicTypeSize(.medium ... .xxxLarge)
    }
}

如果用户的系统字体设置超出 .xxxLarge(例如辅助功能尺寸 .accessibility1),文本大小将被限制在 .xxxLarge。

也可以使用半开区间限制动态字体大小范围:

Text("Hello, Dynamic Type!")
   .dynamicTypeSize(...DynamicTypeSize.xxxLarge)

等效代码

以下写法是等效的,明确指定了范围:

Text("Hello, Dynamic Type!")
    .dynamicTypeSize(.xSmall ... .xxxLarge)

通过 …DynamicTypeSize.xxxLarge,开发者可以确保视图不会因为动态字体的设置而显示异常,为用户提供更好的布局控制。

完全不支持动态类型

可以将范围限制为单一值,从而禁止动态字体变化:

Text("Fixed Size Text")
    .dynamicTypeSize(.medium)

此代码使文本大小固定为 .medium,无论用户的字体设置如何。

支持辅助功能尺寸

如果需要支持辅助功能的大字体(例如 .accessibility1 … .accessibility5),可以指定范围:

Text("Accessible Text")
    .dynamicTypeSize(.medium ... .accessibility5)

不同视图的范围组合

VStack {
    Text("Supports Standard Sizes")
        .dynamicTypeSize(.xSmall ... .xxxLarge)

    Text("Supports Accessibility Sizes")
        .dynamicTypeSize(.accessibility1 ... .accessibility5)
}

第一个 Text 视图支持标准尺寸,第二个 Text 视图支持辅助功能尺寸。

结合 @Environment(\.dynamicTypeSize)

可以动态检查用户的字体大小设置,并基于此调整修饰符:

import SwiftUI

struct ContentView: View {
    @Environment(\.dynamicTypeSize) var dynamicTypeSize

    var body: some View {
        Text("Dynamic Type Example")
            .dynamicTypeSize(dynamicTypeSize.isAccessibilitySize
                             ? .accessibility1 ... .accessibility5
                             : .medium ... .xxxLarge)
    }
}

注意事项

1、内容裁剪问题

如果动态字体过大,而视图未适配,可能会导致内容裁剪。通过限制范围可以避免这一问题。

2、优先级

如果视图树中父视图使用了 .dynamicTypeSize(_),子视图会继承该范围设置,除非子视图明确覆盖此设置。

3、辅助功能优先支持

当用户启用辅助功能字体时,限制范围需要覆盖更大的字体大小(如 .accessibility1 … .accessibility5)。

通过 dynamicTypeSize(_:),开发者可以更灵活地控制视图在不同动态字体下的表现,为用户提供更好的体验。

相关文章

SwiftUI环境变量Dynamic Type Size动态类型大小:https://fangjunyu.com/2024/12/24/swiftui%e7%8e%af%e5%a2%83%e5%8f%98%e9%87%8fdynamic-type-size%e5%8a%a8%e6%80%81%e7%b1%bb%e5%9e%8b%e5%a4%a7%e5%b0%8f/

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注