Я использую SwiftUI Сборщик (MenuPickerStyle()). Параметры в средстве выбора идеально расширяются, как показано на изображениях ниже.
Код :
import SwiftUI
struct TestView: View {
var months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
@State private var selectedMonth = ""
var body: some View {
Picker(selectedMonth, selection: $selectedMonth) {
ForEach(months, id: \.self) {
Text($0)
}
}
.frame(maxWidth: .infinity, alignment: .top)
.pickerStyle(MenuPickerStyle())
.foregroundColor(Color.black)
.font(.custom("poppins_regular", size: 15))
}
}
struct TestView_Previews: PreviewProvider {
static var previews: some View {
TestView()
}
}
Но это работает только тогда, когда я нажимаю на Сборщик.
Могу ли я просто расширить его снаружи? (3-й скриншот)
Пример: Могу ли я развернуть его одним нажатием кнопки?
Button("Click to expand picker options"){
// Can I expand picker option by this Button click?
}
Picker(selectedMonth, selection: $selectedMonth) {
ForEach(months, id: \.self) {
Text($0)
}
}
.frame(maxWidth: .infinity, alignment: .top)
.pickerStyle(MenuPickerStyle())
.foregroundColor(Color.black)
.font(.custom("poppins_regular", size: 15))
}





Скорее всего, невозможно использовать собственный сборщик.
Однако, если функциональность стандартных элементов управления ограничена или не работает должным образом, создайте новый и настройте его по своему усмотрению :)
struct MyPicker : View {
@Namespace var namespace
@Binding var values : [String]
@Binding var selected : String
@Binding var isExpanded : Bool
var body: some View {
if isExpanded {
List(values, id: \.self) { value in
Text("\(value)")
.foregroundColor(Color.black)
.contentShape(Rectangle())
.onTapGesture {
withAnimation {
selected = value
isExpanded.toggle()
}
}
.listRowBackground(selected == value ? Color.green.opacity(0.3) : Color.white)
}.matchedGeometryEffect(id: "menu", in: namespace)
} else {
Text("\(selected != "" ? selected : values.first!)").padding()
.frame(maxWidth: .infinity, alignment: .leading)
.background(Rectangle().foregroundColor(.green.opacity(0.3)).cornerRadius(5))
.matchedGeometryEffect(id: "menu", in: namespace)
.foregroundColor(Color.black)
.padding()
}
}
}
прикрепите его туда, где вам это нужно, и настройте его по мере необходимости.
struct PickerView: View {
@State var months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
@State private var selectedMonth = "January"
@State var expanded : Bool = false
var body: some View {
VStack {
MyPicker(values: $months, selected: $selectedMonth, isExpanded: $expanded)
.frame(maxWidth: .infinity, alignment: .top)
.foregroundColor(Color.black)
Button("Click to \(expanded ? "collapse" : "expand") picker options"){
// Can I expand picker option by this Button click?
withAnimation {
expanded.toggle()
}
}.padding()
}
}
}
Это отличное решение, чувак! Большое спасибо!