Для тех, кто хочет сделать это мертвой точкой, просто поместите два HStack
с каждой стороны и сделайте их ширину фиксированной и одинаковой.
Добавьте этот метод к расширению View
.
extension View {
func navigationBarItems<L, C, T>(leading: L, center: C, trailing: T) -> some View where L: View, C: View, T: View {
self.navigationBarItems(leading:
HStack{
HStack {
leading
}
.frame(width: 60, alignment: .leading)
Spacer()
HStack {
center
}
.frame(width: 300, alignment: .center)
Spacer()
HStack {
//Text("asdasd")
trailing
}
//.background(Color.blue)
.frame(width: 100, alignment: .trailing)
}
//.background(Color.yellow)
.frame(width: UIScreen.main.bounds.size.width-32)
)
}
}
Теперь у вас есть View
modifier
, который использует то же значение navigationBatItems(:_)
. Вы можете редактировать код в соответствии с вашими потребностями.
Пример использования:
.navigationBarItems(leading: EmptyView(), center:
Picker(selection: self.$choice, label: Text("Pick One")) {
ForEach(0 ..< self.choices.count) {
Text(self.choices[$0])
}
}
.pickerStyle(SegmentedPickerStyle())
}, trailing: EmptyView())
ОБНОВИТЬ
Возникла проблема leading
, и конечные элементы нарушали safeArea
UINavigationBarContentView
. Во время поиска я наткнулся на другое решение в этом ответе. Это небольшая вспомогательная библиотека под названием SwiftUIX. Если вы не хотите устанавливать всю библиотеку - как и я - я создал суть только для navigationBarItems
. Просто добавьте файл в свой проект.
Но не забывайте об этом. Он растягивал Picker
, чтобы покрыть все свободное пространство, и заставлял StatusView
быть уже. Поэтому мне пришлось установить такие рамки;
.navigationBarItems(center:
Picker(...) {
...
}
.frame(width: 150)
, trailing:
StatusView()
.frame(width: 70)
)
person
Faruk
schedule
03.03.2020