Прокладка панели инструментов не работает в дизайне 3 панелей

#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. Похоже, это результат установки всех 3 toolbar групп в .principal . Если я его удалю, он запустится.

2. Я удалю границы, которые были только для моих тестов. Работает очень хорошо для меня, с границами или без них. Однако я нахожусь в бета-версии 9 Монтерея, как и в вопросе, используя бета-версию Xcode 13, а не релиз. Поведение может сильно отличаться в старых системах.

3. @workingdog Спасибо за ответ! Однако я не собираюсь помещать все элементы панели инструментов в основную область. Я обновил вопрос, чтобы включить предполагаемое поведение.

4. Второе изображение, которое вы показываете, — это в значительной степени то, что дает мне мой ответ. Вы получаете что-то другое в своей системе/цели?

5. Исправление: моя ошибка, я тестировал свой код на macos Monterey с помощью MacCatalyst. Это выглядит совсем по-другому, чем в приложении только для macos. Извините, я могу удалить свой ответ, если хотите.