Есть ли способ анимировать элементы навигационной панели с помощью withAnimation(…?
По какой-то причине SwiftUi withAnimation не работает в модификаторе navigationBarItems. Есть ли исправление для этого? Я знаю модификатор .animation для анимированных работ, но этого недостаточно для более сложных анимаций.
Мне было интересно, что никто не задавал этот вопрос раньше, я предполагаю, что у большего количества людей есть проблема. Кто-нибудь знает, как исправить это?
Вот один пример: https://drive.google.com/file/d/1d2Ud2xxhVCJBCfBQwlZ1mJgTnyNpxc_/view?usp=sharing
struct TestView: View {
@State var red = true
var body: some View {
NavigationView {
VStack {
HStack {
Rectangle()
.fill(red ? Color.red : .blue)
.onTapGesture {
withAnimation(Animation.easeIn(duration: 1), {
red.toggle()
})
}
}
Spacer()
}
.navigationTitle("Test")
.navigationBarItems(leading:
HStack {
Rectangle()
.fill(red ? Color.red : .blue)
.onTapGesture {
withAnimation(Animation.easeIn(duration: 1), {
red.toggle()
})
}
}
)
}
}
}
struct TestView_Previews: PreviewProvider {
static var previews: some View {
TestView()
}
}
```
1 ответ
Возможное решение - разделить этот зависимый от состояния анимируемый код в автономное представление, как показано ниже.
Протестировано с Xcode 12.4 / iOS 14.4
struct TestBarAnimationView: View {
@State var red = true
var body: some View {
NavigationView {
VStack {
RectView(red: $red) // << here !!
Spacer()
}
.navigationTitle("Test")
.navigationBarItems(leading:
RectView(red: $red) // << here !!
)
}
}
}
struct RectView: View {
@Binding var red: Bool
var body: some View {
HStack {
Rectangle()
.fill(red ? Color.red : .blue)
.onTapGesture {
withAnimation(Animation.easeIn(duration: 1), {
red.toggle()
})
}
}
}
}