为什么修饰语的顺序有时会被忽略?

移动开发 2026-07-10

据我理解,如果同一个修饰符被多次应用到一个视图上,离视图最近的修饰符应该覆盖后面应用的那个。然而,我注意到有些行为并不一致。

请看下面的示例:

VStack {
    Text("Text 1st")
        .font(.title2)
        .fontDesign(.rounded) // is ignored
        .fontWeight(.bold)
        .fontDesign(.serif) // 2nd. modifier wins

    Text("Text 2nd")
        .font(.title2)
        .fontWeight(.bold) // 1st. modifier wins
        .fontDesign(.rounded)
        .fontWeight(.ultraLight) // is ignored
}

在第一个 Text 中,尽管它在另一个字体修饰符之后,.serif fontDesign 仍然被应用。

然而,在第二个例子中,当使用 .fontWeight 时,.bold 修饰符的行为符合预期并覆盖下面的那个。

在这种情况下,为什么 fontDesign 的行为与 fontWeight 不同?SwiftUI中修饰符顺序的工作方式是否存在例外,还是我遗漏了什么?

解决方案

每个修饰符都各不相同,但文档通常会提示其工作原理。

设置此视图中文本的字体设计。

在这种情况下,有一种方法可以通过 nil 阻止较高层的修饰符。

可用的字体设计之一。传入nil将移除在视图层级中较高位置应用的任何字体设计修饰符的效果。

.fontDesign(nil)

https://developer.apple.com/documentation/swiftui/view/fontdesign(_:)

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章