Skip to content

构建适应字体样式、动态类型和不同字符串长度的布局。

在编写包含文本的视图时,定义与该文本相关的其他元素(如符号或填充)非常重要,这样视图才能适应文本的大小。

符号和填充可以随着文本内容的本地化、动态类型大小的变化而调整,或者显示不同的短语。

第 1 部分

将内容与文本关联起来 此示例协调了名称和符号,以使用 Label 表示单个项目。它还在 background(alignment:content:) 修饰符中定义了一个 Capsule ,以便在 Label 周围保持一致的边距。

步骤 1

为了使 Keyword Bubble 可重复使用,标签的文本和符号名称是视图的属性。当其他视图使用 Keyword Bubble 时,该视图会指定要显示的文本和符号。

import SwiftUI


// Source file for Section 1
struct KeywordBubbleDefaultPadding: View {
    let keyword: String
    let symbol: String
    var body: some View {
        Label(keyword, systemImage: symbol)
            .font(.title)
            .foregroundColor(.white)
            .padding()
            .background(.purple.opacity(0.75), in: Capsule())
    }
}


struct KeywordBubbleDefaultPadding_Previews: PreviewProvider {
    static let keywords = ["chives", "fern-leaf lavender"]
    static var previews: some View {
        VStack {
            ForEach(keywords, id: \.self) { word in
                KeywordBubbleDefaultPadding(keyword: word, symbol: "leaf")
            }
        }
    }
}

第 2 步

Label 是一个内置视图,用于排列文本和符号(该视图的主要内容)。Label Label 调整符号的大小并对齐这两部分内容,因此您无需手动将 Text 与 Image 对齐。

system Image 参数用于检索要显示的系统图像。如需查找可用系统图像的名称,请下载 SF Symbols 应用。

import SwiftUI


// Source file for Section 1
struct KeywordBubbleDefaultPadding: View {
    let keyword: String
    let symbol: String
    var body: some View {
        Label(keyword, systemImage: symbol)
            .font(.title)
            .foregroundColor(.white)
            .padding()
            .background(.purple.opacity(0.75), in: Capsule())
    }
}


struct KeywordBubbleDefaultPadding_Previews: PreviewProvider {
    static let keywords = ["chives", "fern-leaf lavender"]
    static var previews: some View {
        VStack {
            ForEach(keywords, id: \.self) { word in
                KeywordBubbleDefaultPadding(keyword: word, symbol: "leaf")
            }
        }
    }
}

第 2 步

Label 是一个内置视图,用于排列文本和符号(该视图的主要内容)。Label Label 调整符号的大小并对齐这两部分内容,因此您无需手动将 Text 与 Image 对齐。

system Image 参数用于检索要显示的系统图像。如需查找可用系统图像的名称,请下载 SF Symbols 应用。

import SwiftUI


// Source file for Section 1
struct KeywordBubbleDefaultPadding: View {
    let keyword: String
    let symbol: String
    var body: some View {
        Label(keyword, systemImage: symbol)
            .font(.title)
            .foregroundColor(.white)
            .padding()
            .background(.purple.opacity(0.75), in: Capsule())
    }
}


struct KeywordBubbleDefaultPadding_Previews: PreviewProvider {
    static let keywords = ["chives", "fern-leaf lavender"]
    static var previews: some View {
        VStack {
            ForEach(keywords, id: \.self) { word in
                KeywordBubbleDefaultPadding(keyword: word, symbol: "leaf")
            }
        }
    }
}

步骤3

Label 对文本和图像应用相同的字体。显示 SF 符号的图像使用字体信息来确定其大小和位置。

实验 尝试一些其他 Font .Text Style 值,例如 Font .Text Style .large Title 或 Font .Text Style .caption 来查看单词和叶子符号的大小如何变化。

import SwiftUI


// Source file for Section 1
struct KeywordBubbleDefaultPadding: View {
    let keyword: String
    let symbol: String
    var body: some View {
        Label(keyword, systemImage: symbol)
            .font(.title)
            .foregroundColor(.white)
            .padding()
            .background(.purple.opacity(0.75), in: Capsule())
    }
}


struct KeywordBubbleDefaultPadding_Previews: PreviewProvider {
    static let keywords = ["chives", "fern-leaf lavender"]
    static var previews: some View {
        VStack {
            ForEach(keywords, id: \.self) { word in
                KeywordBubbleDefaultPadding(keyword: word, symbol: "leaf")
            }
        }
    }
}

步骤4

使用不带任何参数的 padding(_: _😃 修饰符会创建一个视图,该视图在其修改的视图的所有四个边缘上添加默认空间量。

import SwiftUI


// Source file for Section 1
struct KeywordBubbleDefaultPadding: View {
    let keyword: String
    let symbol: String
    var body: some View {
        Label(keyword, systemImage: symbol)
            .font(.title)
            .foregroundColor(.white)
            .padding()
            .background(.purple.opacity(0.75), in: Capsule())
    }
}


struct KeywordBubbleDefaultPadding_Previews: PreviewProvider {
    static let keywords = ["chives", "fern-leaf lavender"]
    static var previews: some View {
        VStack {
            ForEach(keywords, id: \.self) { word in
                KeywordBubbleDefaultPadding(keyword: word, symbol: "leaf")
            }
        }
    }
}

步骤5

Capsule 形状提供了一个圆角矩形,它可以展开以填充其容器。 fill(: style:) 修饰符指定胶囊的颜色, opacity(😃 使胶囊具有一定的透明度。

import SwiftUI


// Source file for Section 1
struct KeywordBubbleDefaultPadding: View {
    let keyword: String
    let symbol: String
    var body: some View {
        Label(keyword, systemImage: symbol)
            .font(.title)
            .foregroundColor(.white)
            .padding()
            .background(.purple.opacity(0.75), in: Capsule())
    }
}


struct KeywordBubbleDefaultPadding_Previews: PreviewProvider {
    static let keywords = ["chives", "fern-leaf lavender"]
    static var previews: some View {
        VStack {
            ForEach(keywords, id: \.self) { word in
                KeywordBubbleDefaultPadding(keyword: word, symbol: "leaf")
            }
        }
    }
}

步骤6

为了指定胶囊位于文本和符号后面,代码在 background(alignment:content:) 修饰符内定义了胶囊。

胶囊的大小包括 Label 周围的填充,因为 background 修饰符位于 padding 修饰符之后。

import SwiftUI


// Source file for Section 1
struct KeywordBubbleDefaultPadding: View {
    let keyword: String
    let symbol: String
    var body: some View {
        Label(keyword, systemImage: symbol)
            .font(.title)
            .foregroundColor(.white)
            .padding()
            .background(.purple.opacity(0.75), in: Capsule())
    }
}


struct KeywordBubbleDefaultPadding_Previews: PreviewProvider {
    static let keywords = ["chives", "fern-leaf lavender"]
    static var previews: some View {
        VStack {
            ForEach(keywords, id: \.self) { word in
                KeywordBubbleDefaultPadding(keyword: word, symbol: "leaf")
            }
        }

第 2 节

在 Xcode 中预览自定义视图 Xcode 提供了一个 Canvas,您可以在其中预览代码更改时的布局。要查看自定义 SwiftUI 视图的预览,请实现 Preview Provider 协议。Canvas 可以显示视图的多种变体,以便您了解它如何适应不同的环境。

步骤 1

您可以在 Xcode 中并排查看 SwiftUI View 的实时预览以及定义它的代码。

第 2 步

要预览自定义视图,请通过定义静态 previews 属性来实现 Preview Provider 协议。

import SwiftUI


// Source file for Section 1
struct KeywordBubbleDefaultPadding: View {
    let keyword: String
    let symbol: String
    var body: some View {
        Label(keyword, systemImage: symbol)
            .font(.title)
            .foregroundColor(.white)
            .padding()
            .background(.purple.opacity(0.75), in: Capsule())
    }
}


struct KeywordBubbleDefaultPadding_Previews: PreviewProvider {
    static let keywords = ["chives", "fern-leaf lavender"]
    static var previews: some View {
        VStack {
            ForEach(keywords, id: \.self) { word in
                KeywordBubbleDefaultPadding(keyword: word, symbol: "leaf")
            }
        }
    }
}

步骤3

要验证您的视图是否适用于一系列输入,请配置多个预览,并定义要在每个预览中显示的静态数据。

keywords 数组定义了两个不同长度的 String 值。 previews 属性在 VStack 中定义了这两个值,以显示 Keyword Bubble 视图如何适应文本长度。

步骤4

此行定义了 Keyword Bubble 视图,并为其提供了文本和图像。

实验 尝试将 leaf 替换为其他 SF 符号的名称。有关自定义 SF 符号外观的更多信息,请参阅人机界面指南中的 SF 符号 。

import SwiftUI


// Source file for Section 1
struct KeywordBubbleDefaultPadding: View {
    let keyword: String
    let symbol: String
    var body: some View {
        Label(keyword, systemImage: symbol)
            .font(.title)
            .foregroundColor(.white)
            .padding()
            .background(.purple.opacity(0.75), in: Capsule())
    }
}


struct KeywordBubbleDefaultPadding_Previews: PreviewProvider {
    static let keywords = ["chives", "fern-leaf lavender"]
    static var previews: some View {
        VStack {
            ForEach(keywords, id: \.self) { word in
                KeywordBubbleDefaultPadding(keyword: word, symbol: "leaf")
            }
        }
    }
}

步骤5

要验证视图在各种动态类型文本大小下的外观,请在 Xcode Canvas 视图中选择“变体 > 动态类型变体”。

第 3 节

使用 ScaledMetric 调整尺寸 尺寸的默认值(例如此视图的内边距或框架的宽度和高度)并不总是适合您的布局。在许多情况下,您可以设计一组较小的值以在各种环境中使用。但是,动态类型设置和 Font .Text Style 选项的组合超过一百种,因此为每种设置选择一个特定的值并不实际。当您需要提供适应环境有效字体大小的数值时,请使用 Scaled Metric 属性包装器。

步骤 1

查看 AX 5 文本大小的 Keyword Bubble Default Padding 预览。使用默认填充时,叶子符号的尖端会与 Capsule 形状的边缘相撞。

为了使大文本尺寸时的内容保留在气泡内,而不为小文本尺寸添加太多填充,请定义一个随文本大小缩放的自定义填充指标。

第 2 步

此 padding Width 变量为 Dynamic Type Size .large 动态类型环境中的内容提供 14 .5 的值。使用 Scaled Metric 属性包装器时,该值会根据 dynamic Type Size 的当前值按比例增大或减小。

有关使用 Scaled Metric 按文本比例缩放尺寸的更多信息,请参阅将自定义字体应用于文本 。

import SwiftUI


// Source file for Section 2
struct KeywordBubble: View {
    let keyword: String
    let symbol: String
    @ScaledMetric(relativeTo: .title) var paddingWidth = 14.5
    var body: some View {
        Label(keyword, systemImage: symbol)
            .font(.title)
            .foregroundColor(.white)
            .padding(paddingWidth)
            .background {
                Capsule()
                    .fill(.purple.opacity(0.75))
            }
    }
}


struct KeywordBubble_Previews: PreviewProvider {
    static let keywords = ["chives", "fern-leaf lavender"]
    static var previews: some View {
        VStack {
            ForEach(keywords, id: \.self) { word in
                KeywordBubble(keyword: word, symbol: "leaf")
            }
        }
    }
}

步骤3

Label 使用 Font .Text Style .title 样式来定义文本大小。

为文本 Font .Text Style .title text Style .title 表示该指标随标题样式缩放或相对于 title 样式。

import SwiftUI


// Source file for Section 2
struct KeywordBubble: View {
    let keyword: String
    let symbol: String
    @ScaledMetric(relativeTo: .title) var paddingWidth = 14.5
    var body: some View {
        Label(keyword, systemImage: symbol)
            .font(.title)
            .foregroundColor(.white)
            .padding(paddingWidth)
            .background {
                Capsule()
                    .fill(.purple.opacity(0.75))
            }
    }
}


struct KeywordBubble_Previews: PreviewProvider {
    static let keywords = ["chives", "fern-leaf lavender"]
    static var previews: some View {
        VStack {
            ForEach(keywords, id: \.self) { word in
                KeywordBubble(keyword: word, symbol: "leaf")
            }
        }
    }
}

步骤4

padding(😃 修饰符会在标签的四边添加一定数量的空间(以磅为单位)。由于 padding Width 是一个 Scaled Metric ,因此当 Label 使用较大的文本尺寸时, padding(😃 会添加更多空间。

import SwiftUI


// Source file for Section 2
struct KeywordBubble: View {
    let keyword: String
    let symbol: String
    @ScaledMetric(relativeTo: .title) var paddingWidth = 14.5
    var body: some View {
        Label(keyword, systemImage: symbol)
            .font(.title)
            .foregroundColor(.white)
            .padding(paddingWidth)
            .background {
                Capsule()
                    .fill(.purple.opacity(0.75))
            }
    }
}


struct KeywordBubble_Previews: PreviewProvider {
    static let keywords = ["chives", "fern-leaf lavender"]
    static var previews: some View {
        VStack {
            ForEach(keywords, id: \.self) { word in
                KeywordBubble(keyword: word, symbol: "leaf")
            }
        }
    }
}

步骤5

使用 Scaled Metric 变量填充,所有动态类型变体现在在叶子符号和背景中的 Capsule 形状边缘之间都有填充。