Ios SwiftUI HStack带几何导板和衬垫
在我的iOS应用程序中,我想放置两个宽度相同的视图,以便它们填充父视图的整个宽度 为此,我使用GeometryReader,它打破了自动布局。但是“自动布局”不起作用,并且不会自动计算此视图的高度。TestView的高度未确定,所以我无法手动添加帧大小 下面是它应该是什么样子(我期望的是TestView): 这就是我在列表中放置视图时的样子(currencesview): TestView.swiftIos SwiftUI HStack带几何导板和衬垫,ios,swift,swiftui,Ios,Swift,Swiftui,在我的iOS应用程序中,我想放置两个宽度相同的视图,以便它们填充父视图的整个宽度 为此,我使用GeometryReader,它打破了自动布局。但是“自动布局”不起作用,并且不会自动计算此视图的高度。TestView的高度未确定,所以我无法手动添加帧大小 下面是它应该是什么样子(我期望的是TestView): 这就是我在列表中放置视图时的样子(currencesview): TestView.swift struct TestView: View { var body: some Vi
struct TestView: View {
var body: some View {
GeometryReader { geometry in
HStack(spacing: 0) {
VStack(alignment: .leading, spacing: 0.0) {
Text("Name 1\n Test second name 2")
.font(.system(size: 18))
.fontWeight(.bold)
HStack {
Text("123")
Text(" + 5")
}
}
.padding(.horizontal, 12.0)
.padding(.vertical, 9.0)
.frame(width: geometry.size.width / 2)
.background(RoundedRectangle(cornerRadius: 8.0)
.foregroundColor(Color.blue
.opacity(0.2)))
VStack(alignment: .leading, spacing: 0.0) {
Text("Name 1")
.font(.system(size: 18))
.fontWeight(.bold)
HStack {
Text("123")
Text(" + 5")
}
}
.padding(.horizontal, 12.0)
.padding(.vertical, 9.0)
.frame(width: geometry.size.width / 2)
.background(RoundedRectangle(cornerRadius: 8.0)
.foregroundColor(Color.blue
.opacity(0.2)))
}
}
}
}
struct CurrenciesView: View {
@State private var items: [Str] = (0..<5).map { i in
return Str(title: "Struct #\(i)")
}
var body: some View {
NavigationView {
List {
Section(header:
TestView().listRowInsets(EdgeInsets())
) {
ForEach(items) { item in
Text("asd")
}
}.clipped()
}
.navigationBarTitle("Section Name")
.navigationBarItems(trailing: EditButton())
}
}
}
currencesview.swift
struct TestView: View {
var body: some View {
GeometryReader { geometry in
HStack(spacing: 0) {
VStack(alignment: .leading, spacing: 0.0) {
Text("Name 1\n Test second name 2")
.font(.system(size: 18))
.fontWeight(.bold)
HStack {
Text("123")
Text(" + 5")
}
}
.padding(.horizontal, 12.0)
.padding(.vertical, 9.0)
.frame(width: geometry.size.width / 2)
.background(RoundedRectangle(cornerRadius: 8.0)
.foregroundColor(Color.blue
.opacity(0.2)))
VStack(alignment: .leading, spacing: 0.0) {
Text("Name 1")
.font(.system(size: 18))
.fontWeight(.bold)
HStack {
Text("123")
Text(" + 5")
}
}
.padding(.horizontal, 12.0)
.padding(.vertical, 9.0)
.frame(width: geometry.size.width / 2)
.background(RoundedRectangle(cornerRadius: 8.0)
.foregroundColor(Color.blue
.opacity(0.2)))
}
}
}
}
struct CurrenciesView: View {
@State private var items: [Str] = (0..<5).map { i in
return Str(title: "Struct #\(i)")
}
var body: some View {
NavigationView {
List {
Section(header:
TestView().listRowInsets(EdgeInsets())
) {
ForEach(items) { item in
Text("asd")
}
}.clipped()
}
.navigationBarTitle("Section Name")
.navigationBarItems(trailing: EditButton())
}
}
}
struct currencesview:View{
@状态私有变量项:[Str]=(0..您可以创建自定义的首选项键和计算该项的视图:
struct ViewSizeKey: PreferenceKey {
static var defaultValue: CGSize = .zero
static func reduce(value: inout CGSize, nextValue: () -> CGSize) {
value = nextValue()
}
}
然后,您可以在视图中使用它们。请注意,您需要在TestView
中使用@Binding
,在父视图中使用@State private var headerSize
。否则父视图将不会刷新,列表也不会正确地重新计算头大小
struct CurrenciesView: View {
@State private var items: [String] = (0 ..< 5).map(String.init)
@State private var headerSize: CGSize = .zero
var body: some View {
NavigationView {
List {
Section(header:
TestView(viewSize: $headerSize)
) {
ForEach(items, id: \.self) {
Text($0)
}
}.clipped()
}
.navigationBarTitle("Section Name")
.navigationBarItems(trailing: EditButton())
}
}
}
你找到解决问题的办法了吗?