SwiftUI 将 SF 符号作为文本与文本对齐

SwiftUI align SF Symbol as text with a text

我需要在视图中显示一个 SF 符号(图像)和一个文本(作为标题)。由于文本可能很长,我希望它在第二行的图像下方通过。

预期结果(几乎!):

我首先尝试了 HStack 图片和文字。但是文本不在图像下方:第二行以左 'padding' 开头(对应于左图像 space)。

所以我做了这段代码(以获取之前的屏幕截图):

HStack(alignment:.top) {
    Text(Image(systemName: "circle.hexagongrid.circle"))
        .font(.caption)
        .foregroundColor(.pink)
    +
    Text("A long text as example")
        .font(.title2).bold()
        .foregroundColor(.pink)
}
.frame(width:140)

但我想将图像与第一行的中心对齐。图片中心应垂直位于 A 顶部和 g 底部的中间。

重要的是我的第二条(以及更多)线在我的图像下方通过。而且我不想要更大的图像字体。

首先,您可以删除 HStack,因为它是多余的。您可以将其替换为方括号 () 以封装新的 Text,这样您就可以使用更多修饰符,例如设置宽度。

主要解决方案是使用 baselineOffset(_:),这意味着您可以将图像从 Text 的基线偏移。下面,我们只偏移 1,但这可以是您想要的任何值(包括小数,例如 0.99)。

代码:

struct ContentView: View {
    var body: some View {
        (
            Text(Image(systemName: "circle.hexagongrid.circle"))
                .font(.caption)
                .foregroundColor(.pink)
                .baselineOffset(1)
            +
            Text("A long text as example")
                .font(.title2)
                .bold()
                .foregroundColor(.pink)
        )
        .frame(width: 140)
    }
}

结果:


好处:您可以在 Text 合并后移动您的 foregroundColor(.pink) 修饰符,因此您不必复制它。

我不知道你是否可以强制图像在所有情况下自动居中,但你可以向文本中的图像添加一个 .baselineOffset() 修饰符以将图像向上移动一个固定的数量。例如:


Text(Image(systemName: "circle.hexagongrid.circle"))
  .font(.caption)
  .foregroundColor(.pink)
  .baselineOffset(3.0)
+
Text("A long text as example")
  .font(.title2).bold()
  .foregroundColor(.pink)

一旦找到默认文本大小的正确偏移量,您就可以通过使偏移大小相对于基本大小来适应可访问性变化,例如

Struct MyView: View {
  @ScaledMetric(relativeTo: .title2) var baselineOffset: CGFloat = 3.0

  // and in your body…
  .baselineOffset(baselineOffset)