SwiftUI GeometryReader 体积小巧
SwiftUI GeometryReader compact size
我希望 LoadingTitle
的宽度为屏幕的 70%,所以我使用 GeometryReader
,但它会使垂直尺寸扩大,而我的 LoadingTitle
需要更多垂直 space。我希望它尽可能保持紧凑。
当使用硬编码时 width: 300
我得到了正确的布局(相对宽度除外):
struct ContentView: View {
var body: some View {
VStack(alignment: .leading, spacing: 0) {
LoadingTitle()
Color.blue
}
}
}
struct LoadingTitle: View {
var body: some View {
HStack() {
Color.gray
}
.frame(width: 300, height: 22)
.padding(.vertical, 20)
.border(Color.gray, width: 1)
}
}
现在,如果我将 LoadingTitle
的 body
包裹在 GeometryReader
中,我可以获得正确的相对大小,但 GeometryReader
会垂直扩展我的视图:
struct LoadingTitle: View {
var body: some View {
GeometryReader { geo in
HStack() {
Color.gray
.frame(width: geo.size.width * 0.7, height: 22, alignment: .leading)
Spacer()
}
.padding(.vertical, 20)
.border(Color.gray, width: 1)
}
}
}
我尝试在 GeometryReader
上使用 .fixedSize(horizontal: false, vertical: true)
作为 ,但是结果视图太紧凑了,所有填充都被忽略了:
如何实现第一个屏幕截图的相对宽度布局?
这是可能的方法。使用 Xcode 11.4 / iOS 13.4 进行测试(ContentView 未更改)
struct LoadingTitle: View {
var body: some View {
VStack { Color.clear }
.frame(height: 22).frame(maxWidth: .infinity)
.padding(.vertical, 20)
.overlay(
GeometryReader { geo in
HStack {
HStack {
Color.gray
.frame(width: geo.size.width * 0.7, height: 22)
}
.padding(.vertical, 20)
.border(Color.gray, width: 1)
Spacer()
}
}
)
}
}
由于标题的高度是固定的,
struct LoadingTitle1: View {
var body: some View {
GeometryReader { geo in
HStack {
Color.gray.frame(width: geo.size.width * 0.7)
.padding(.vertical, 20)
.border(Color.gray, width: 1)
Spacer()
}
}.frame(height: 62)
}
}
我希望 LoadingTitle
的宽度为屏幕的 70%,所以我使用 GeometryReader
,但它会使垂直尺寸扩大,而我的 LoadingTitle
需要更多垂直 space。我希望它尽可能保持紧凑。
当使用硬编码时 width: 300
我得到了正确的布局(相对宽度除外):
struct ContentView: View {
var body: some View {
VStack(alignment: .leading, spacing: 0) {
LoadingTitle()
Color.blue
}
}
}
struct LoadingTitle: View {
var body: some View {
HStack() {
Color.gray
}
.frame(width: 300, height: 22)
.padding(.vertical, 20)
.border(Color.gray, width: 1)
}
}
现在,如果我将 LoadingTitle
的 body
包裹在 GeometryReader
中,我可以获得正确的相对大小,但 GeometryReader
会垂直扩展我的视图:
struct LoadingTitle: View {
var body: some View {
GeometryReader { geo in
HStack() {
Color.gray
.frame(width: geo.size.width * 0.7, height: 22, alignment: .leading)
Spacer()
}
.padding(.vertical, 20)
.border(Color.gray, width: 1)
}
}
}
我尝试在 GeometryReader
上使用 .fixedSize(horizontal: false, vertical: true)
作为
如何实现第一个屏幕截图的相对宽度布局?
这是可能的方法。使用 Xcode 11.4 / iOS 13.4 进行测试(ContentView 未更改)
struct LoadingTitle: View {
var body: some View {
VStack { Color.clear }
.frame(height: 22).frame(maxWidth: .infinity)
.padding(.vertical, 20)
.overlay(
GeometryReader { geo in
HStack {
HStack {
Color.gray
.frame(width: geo.size.width * 0.7, height: 22)
}
.padding(.vertical, 20)
.border(Color.gray, width: 1)
Spacer()
}
}
)
}
}
由于标题的高度是固定的,
struct LoadingTitle1: View {
var body: some View {
GeometryReader { geo in
HStack {
Color.gray.frame(width: geo.size.width * 0.7)
.padding(.vertical, 20)
.border(Color.gray, width: 1)
Spacer()
}
}.frame(height: 62)
}
}