Пожалуйста, поддержите меня в этом вопросе, поскольку я все еще изучаю разработку iOS с использованием Swift.
В настоящее время у меня есть приложение, в котором ContentView представляет собой MapView с четкой панелью инструментов вверху. На панели инструментов есть единственная кнопка, расположенная в позиции .topLeading
.
Когда я нажимаю кнопку, открывается боковое меню, а панель инструментов скрывается с помощью
.toolbarBackground(.hidden, for: .navigationBar)
. Это работает так, как ожидалось.
В этом боковом меню я использую NavigationLink
, чтобы при необходимости показывать разные виды, и именно здесь начинается проблема. Когда я нажимаю кнопку, чтобы перейти к новому виду, примерно через полсекунды вид кажется смещающимся по вертикали. Когда я возвращаюсь в боковое меню, элементы в моем боковом меню также перемещаются по вертикали обратно в нужное место аналогичным образом.
Я сузил проблему до использования .toolbarBackground(.hidden, for: .navigationBar)
. Если я закомментирую этот фрагмент кода, ни одно из представлений или элементов бокового меню не сдвинется.
Использование .toolbar(showMenu ? .hidden : .visible, for: .navigationBar)
также приводит к изменению взглядов.
Оригинальную идею дизайна этого бокового меню я почерпнул из этого видео на Youtube и при необходимости модифицировал ее. В видео действительно наблюдается небольшой сдвиг в сторону фонового представления, поверх которого накладывается боковое меню, но не в самом боковом меню.
Вот мой код для ContentView, содержащего панель инструментов:
struct ContentView: View {
@State private var mapOpacity = 1.0
@State private var toggled = true
@State private var showMenu = false
@State private var locationSheetToggle = false
@ObservedObject var locationManager = LocationManager.sharedLocationManager
var body: some View {
NavigationStack {
ZStack {
ZStack {
VStack {
MapView().ignoresSafeArea(edges: [.leading, .trailing])
}
.opacity(toggled ? 1.0 : 0.5)
.blur(radius: toggled ? 0.0 : 4.0)
//Toggle
VStack {
Spacer()
HStack {
Text("Map Toggle")
Toggle("Map Toggle", isOn: $toggled).labelsHidden()
}
.padding(.bottom, 20)
.padding(.leading, 10)
}
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .topLeading)
ZStack {
VStack(alignment: .center) {
Group {
HStack {
Image(systemName: "pause.circle")
.resizable()
.foregroundStyle(.red)
.scaledToFit()
Image(systemName: "exclamationmark.triangle")
.resizable()
.foregroundStyle(.yellow)
.scaledToFit()
}
.frame(width: 100, height: 50)
Text("Location tracking paused. No new paths will be drawn")
.fontWeight(.medium)
.padding()
}
}
.padding()
.background(.ultraThinMaterial)
.clipShape(RoundedRectangle(cornerRadius: 25))
.transition(.symbolEffect)
}
.animation(.easeInOut,
value: LocationManager.sharedLocationManager.locationPaused || LocationManager.sharedLocationManager.authStatus == .denied)
.frame(width: 250, height: 750, alignment: .top)
.opacity(LocationManager.sharedLocationManager.locationPaused || LocationManager.sharedLocationManager.authStatus == .denied ? 1.0 : 0.0)
}
.onAppear(perform: {
if locationManager.authStatus != .authorizedAlways {
locationSheetToggle.toggle()
}
}).sheet(isPresented: $locationSheetToggle, content: {
LocationRequestView(locationSheetToggle: $locationSheetToggle)
})
SideMenuView(isShowing: $showMenu)
}
.toolbar {
ToolbarItemGroup(placement: .topBarLeading) {
Button(action: {
showMenu.toggle()
}, label: {
Image(systemName: "line.3.horizontal.circle.fill")
.foregroundStyle(.primary)
.frame(width: 45, height: 45)
.background(Color(UIColor.systemGray5))
.clipShape(RoundedRectangle(cornerRadius: 10))
})
.opacity(showMenu ? 0.0 : 1.0)
}
}
.toolbarBackground(.hidden, for: .navigationBar)
}
}
}
Я подозреваю, что мой макет представления или мое неправильное понимание использования .hidden
, вероятно, является причиной этой проблемы, но я не могу найти других примеров такого поведения.
.navigationBarTitleDisplayMode(.inline)
на панели инструментов в ContentView, похоже, решило проблему. Не знаю точно, почему, поэтому я проведу дополнительные исследования, но если у кого-то есть какие-либо идеи, я буду очень признателен. Спасибо!