私の目標は、2 つのピッカーを横に並べて配置し、各ピッカーが画面の半分の幅を占めるようにすることです。画面の幅に収まり、同じ幅の 2 つのコンポーネントを持つa を想像してみてくださいUIPickerView
。これが、私が SwiftUI で再作成しようとしているものです。
SwiftUI のピッカーは現在複数のコンポーネントを許可していないため、私にとって明らかな代替手段は、2 つのピッカーを .xml 内に配置することでしたHStack
。
テスト プロジェクトのコード例を次に示します。
struct ContentView: View {
@State var selection1: Int = 0
@State var selection2: Int = 0
@State var integers: [Int] = [0, 1, 2, 3, 4, 5]
var body: some View {
HStack {
Picker(selection: self.$selection1, label: Text("Numbers")) {
ForEach(self.integers) { integer in
Text("\(integer)")
}
}
Picker(selection: self.$selection2, label: Text("Numbers")) {
ForEach(self.integers) { integer in
Text("\(integer)")
}
}
}
}
}
そして、ここにキャンバスがあります:
ピッカーは、私が期待するように画面の幅の半分にサイズ変更されません。それらはサイズを保持し、代わりにコンテンツ ビューの幅を引き伸ばし、その過程で他の UI 要素の幅をゆがめます (これは、他のプロジェクトでこれを試みたときにわかりました)。
必要な効果を得るために使用できることはわかっていますUIViewRepresentable
が、これを使用しようとしている目的の複雑さを考えると、SwiftUI の方がはるかに使いやすいでしょう。
2 つのピッカーを の中に配置HStack
してもサイズが適切に変更されないのはバグですか? それとも、SwiftUI のピッカーの幅が固定されていて変更できないのでしょうか?
アップデート
を使用しGeometryReader
て、ピッカーのサイズを希望どおりに変更することに成功しましたが、完全にはできませんでした。
補足: を使用せずGeometryReader
に、各ピッカーのフレームを に設定するだけで、これと同じ不完全な結果を実現することもできます.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
。
コード例は次のとおりです。
struct ContentView: View {
@State var selection1: Int = 0
@State var selection2: Int = 0
@State var integers: [Int] = [0, 1, 2, 3, 4, 5]
var body: some View {
GeometryReader { geometry in
HStack(spacing: 0) {
Picker(selection: self.$selection1, label: Text("Numbers")) {
ForEach(self.integers) { integer in
Text("\(integer)")
}
}
.frame(maxWidth: geometry.size.width / 2)
Picker(selection: self.$selection2, label: Text("Numbers")) {
ForEach(self.integers) { integer in
Text("\(integer)")
}
}
.frame(maxWidth: geometry.size.width / 2)
}
}
}
}
そして、ここにキャンバスがあります:
GeometryReader を使用した HStack のピッカー
ピッカーは私が望む外観に近づいていますが、サイジングはまだわずかにずれており、真ん中で互いに重なっています.