我从以下代码开始:
import SwiftUI
struct ContentView: View {
var body: some View {
HStack(spacing: 20) {
ExtractedView(text: "Energy")
ExtractedView(text: "Breath Control")
}
.padding(.horizontal, 20)
}
}
#Preview {
ContentView()
}
struct ExtractedView: View {
let text: String
var body: some View {
Button {
} label: {
HStack(spacing: 8) {
Image(systemName: "globe")
.imageScale(.large)
.foregroundStyle(.tint)
Text(text)
.lineLimit(1)
.font(.system(size: 18, weight: .bold))
}
.padding(.horizontal, 8)
.padding(.vertical, 8)
.background {
Color.yellow
}
}
}
}
换句话说,我需要在每个元素内的文本后添加相等的间距,但我不知道该怎么做。尝试了不同的代码,但按钮大小变得相等,或者 iOS 为第二个标签添加了换行符,或者即使有足够的空间也试图缩短第二个标签。
解决的一种方法是使用自定义
Layout
:以下是一个按照这种方式工作的示例实现:
还需要对 进行更改,以便在添加黄色背景之前
ExtractedView
扩展以填充可用宽度:要使用,只需将
HStack
原始代码替换为PaddedToFill
:在您的近似结果屏幕截图中,额外的填充始终位于每个按钮的尾部。要实现此结果,只需
alignment
在设置时maxWidth
添加一个参数ExtractedView
:EDIT
Layout
是在 iOS 16 中引入的。如果您仍需要支持 iOS 15,那么您将需要此版本的后备解决方案。一种方法是使用 测量容器的大小GeometryReader
,然后在按钮之间共享多余的宽度。下面是一个如何用这种方式解决问题的例子。填充按钮的最简单方法是允许将额外填充的大小作为参数传递给
ExtractedView
:额外填充的尺寸的计算方式与自定义的计算方式相同
Layout
,基于容器的理想尺寸。HStack
到背景并使用GeometryReader
来测量其大小可以找到理想的大小。HStack
用另一个部分包裹来测量的GeometryReader
。编辑 2
Layout
如果文本标签在一行上放不下时需要换行,则自定义会变得更加复杂。您可以尝试以下更改:.lineLimit
ExtractedView
sizeThatFits
如果建议宽度小于理想宽度,则将函数更改为请求两倍高度:这是实际需要的高度的一个相当粗略的近似值,它只允许文本换行到一行。更严格的实现需要调用具有减小宽度建议的子视图,其计算方式与 中完全相同
placeSubviews
。placeSubviews