#swift #macos #swiftui #toolbar
Вопрос:
У меня есть 3-панельное приложение SwiftUI для macOS (работает под управлением macOS Monterey Beta 9, Xcode 13 Beta 5), и я добавляю элементы панели инструментов в окно.
Некоторые из этих элементов Spacer
панели инструментов находятся между ними, но я получаю это странное поведение: в области панели инструментов боковой панели есть
Spacer
между 2 кнопками, но, похоже, это не работает. И на панели деталей Spacer
это работает только наполовину.
Вот пример кода:
var body: some View {
NavigationView {
Text("Sidebar")
.frame(minWidth: 200)
.toolbar {
Button(action: {}) { Image(systemName: "sidebar.left") }
Spacer() // Comment out this line, and detail panel works fine
Button(action: {}) { Image(systemName: "play.fill") }
}
Text("Middle")
.frame(minWidth: 200)
.toolbar {
Button(action: {}) { Image(systemName: "trash") }
}
.navigationTitle("Test")
Text("Detail")
.frame(minWidth: 200)
.toolbar {
Button(action: {}) { Image(systemName: "scribble") }
Spacer() // Comment out this line, and sidebar panel works fine
Button(action: {}) { Image(systemName: "ellipsis.circle") }
}
}
}
Странно то, что удаление Spacer
с боковой панели, похоже, устраняет проблему на панели сведений. Это также работает в обратном порядке, поэтому удаление Spacer
с панели сведений исправляет боковую панель.
Вот предполагаемое поведение (я отредактировал изображение):
В чем здесь может быть проблема?
Комментарии:
1. Я могу воспроизвести это, но у меня нет решения.
toolbar
материал на macOS в странном звере. Например, если вы попытаетесь изменить размер среднего столбца, вы увидите, чтоtoolbar
сегмент и представление под ним на самом деле не сохраняют одинаковую ширину. Для меня все это очень странно…2. @jnpdx 100%, я получаю много странного
toolbar
поведения.
Ответ №1:
вы могли бы попробовать что-то вроде этого:
struct ContentView : View {
var body: some View {
NavigationView {
Text("Sidebar").frame(minWidth: 200)
.toolbar {
ToolbarItemGroup (placement: .principal) {
HStack {
Button(action: {}) { Image(systemName: "sidebar.left") }
Spacer()
Button(action: {}) { Image(systemName: "play.fill") }
}
}
}
Text("Middle").frame(minWidth: 200)
.toolbar {
ToolbarItemGroup (placement: .principal) {
HStack {
Text("Test").bold()
Spacer()
Button(action: {}) { Image(systemName: "trash") }
}
}
}
Text("Detail").frame(minWidth: 200)
.toolbar {
ToolbarItemGroup (placement: .principal) {
HStack {
Button(action: {}) { Image(systemName: "scribble") }
Spacer()
Button(action: {}) { Image(systemName: "ellipsis.circle") }
}
}
}
}
}
}
Комментарии:
1. Если я удалю код
.border(.red)
типа, который не работает, если у вас не установлено расширение, то при запуске этого кода немедленно произойдет сбой с ошибкой «[__NSArrayM objectAtIndex:]: индекс 9223372036854775806 за пределами [0 .. 3]» на macOS 11.3. Похоже, это результат установки всех 3toolbar
групп в.principal
. Если я его удалю, он запустится.2. Я удалю границы, которые были только для моих тестов. Работает очень хорошо для меня, с границами или без них. Однако я нахожусь в бета-версии 9 Монтерея, как и в вопросе, используя бета-версию Xcode 13, а не релиз. Поведение может сильно отличаться в старых системах.
3. @workingdog Спасибо за ответ! Однако я не собираюсь помещать все элементы панели инструментов в основную область. Я обновил вопрос, чтобы включить предполагаемое поведение.
4. Второе изображение, которое вы показываете, — это в значительной степени то, что дает мне мой ответ. Вы получаете что-то другое в своей системе/цели?
5. Исправление: моя ошибка, я тестировал свой код на macos Monterey с помощью MacCatalyst. Это выглядит совсем по-другому, чем в приложении только для macos. Извините, я могу удалить свой ответ, если хотите.