我遇到了和你一样的问题:SF Symbols 没有在 iOS 13 上报告正确的内容大小。(虽然,它在 iOS 14 及更高版本上已修复。)
使用UIImage
Matteo Pacinis 解决方案中提出的问题是与 SwiftUI 动态的兼容性差:前景色和字体大小(以及动态类型!)不是简单地取自当前 SwiftUI 上下文,而是必须复制到UIImage
配置中(使用UIImage(systemName:, withConfiguration:)
)这通常是不切实际的。(请参阅hackingwithswift.com了解如何使用它)。
看着上面的问题,我提出以下解决方案:
HStack(alignment: .center, spacing: 10.0) {
Image(systemName: "cloud.sun")
.hidden()
.overlay(
Image(systemName: "cloud.sun")
.resizable()
.aspectRatio(contentMode: .fill)
.background(Color.red)
)
Image(systemName: "cloud")
.hidden()
.overlay(
Image(systemName: "cloud")
.resizable()
.aspectRatio(contentMode: .fill)
.background(Color.yellow)
)
Image(systemName: "cloud.bolt")
.hidden()
.overlay(
Image(systemName: "cloud.bolt")
.resizable()
.aspectRatio(contentMode: .fill)
.background(Color.pink)
)
Text("Text")
.background(Color.green)
}
.background(Color.gray)
.font(.title)
它看起来像很多代码重复,但它有一个优点,符号根据您的缩放font
,尊重foregroundColor
修饰符并根据您的需要对齐alignment
输出:
但是这种方法仍然存在一些问题:图像仍然没有正确的固有尺寸,符号只是“很好地居中”绘制。这意味着HStack
仍然的高度取决于Text
元素的高度。如果您只是想以字体绘制符号.largeTitle
和以字体绘制文本.body
,结果将如下所示,可能会导致与相邻视图重叠:
我仍将进一步调查以找到确保正确视图大小的解决方案,因为这真的让我很恼火。