Estou tentando fazer um popover cujo conteúdo se expande dinamicamente com base nas escolhas acima. Eu me contentaria com nenhuma animação ou, idealmente, o popover se expandindo gradualmente para seu novo conteúdo, mas, em vez disso, parece que coloquei uma visualização de rolagem no popover e você pode ver o menu recarregar.
Curiosamente, se você fizer a mesma coisa com um botão, apenas modificando uma propriedade de estado, essa animação não acontece.
Imagino que, de alguma forma, esteja confundindo o sistema de animação com IDs não estáveis, mas tentei colocar argumentos .id() em tudo e isso não resolveu o problema.
struct DropdownTestView: View {
@State var presentPopover: Bool = false
@State var choice: Int = 0
var body: some View {
VStack {
Button {
presentPopover = true
} label: {
Text("Press To Choose")
}
.popover(isPresented: $presentPopover) {
popoverView
.padding()
}
Spacer()
}
.padding()
}
var popoverView: some View {
VStack(alignment: .leading) {
Divider()
Menu {
ForEach(0..<6) { num in
Button {
choice = num
} label: {
Text("\(num)")
}
}
} label: {
Text("Make A Choice")
}
if choice != 0 {
Divider()
HStack {
Text("WRONG CHOICE")
}
}
}
.frame(width: 220)
}
}
Eu tentei algo assim:
HStack {
Text("WRONG CHOICE")
}
.opacity(choice != 0 ? 1.0 : 0)
.frame(choice != 0 ? 30, 0)
Mas isso também não funciona.
Você precisa mudar o conteúdo do popover para uma
View
struct em vez de uma var computada e ter uma ligação nela. Além disso, é uma boa ideia combinar vars relacionadas em sua própria struct. por exemploParece que a mudança no tamanho do conteúdo entra em vigor imediatamente, mas a mudança no tamanho do popover é animada. Isso seria bom se a âncora para a revelação fosse
.top
, mas parece que pode ser algo como.center
em vez disso.Como solução alternativa, tente envolver o conteúdo do popover em um
ScrollView
. OScrollView
fornece "buffering" para a mudança na altura:Ps. Outra solução alternativa seria usar um popover personalizado. Você pode então estilizar o popover da maneira que quiser e também controlar a maneira como as animações funcionam. A resposta para iOS SwiftUI Need to Display Popover Without "Arrow" fornece um exemplo de implementação (foi minha resposta).