簡體   English   中英

如何在 SwiftUI 中為條件渲染視圖添加過渡?

[英]How to add transition for conditionally rendered view in SwiftUI?

如何為GroupedListStyle列表中的條件渲染視圖添加過渡? 從“設置”中的“請勿打擾”部分實現類似條件DatePicker的功能(請參閱下面的 GIF)。

為條件渲染視圖添加transitionanimation似乎不起作用。

if condition {
    Toggle(isOn: $foo) {
        HStack {
            Text("Foo")
        }
    }
    .transition(.opacity)
    .animation(.easeInOut)
    .toggleStyle(SwitchToggleStyle(tint: Color.red)
}

在此處輸入圖片說明

基於pawello2222的實現

動畫非常流暢,尤其是當視圖即將消失時。 過渡位置從第 1 幀到第 11 幀動畫,但從第 12 幀開始突然消失。

在此處輸入圖片說明

在此處輸入圖片說明

這是一個可能的解決方案,在withAnimation的幫助下更改 Published 值

class ContentViewModel : ObservableObject {
    @Published var isOn : Bool = false {
        didSet {
            withAnimation {
                if isOn {
                    showRow = true
                }
                else {
                    showRow = false
                }
            }
        }
    }
    
    @Published var showRow = false
}

struct ContentView: View {
    
    @ObservedObject var viewModel = ContentViewModel()
            
    var body: some View {
        
        List() {
            
            Text("Hello World")

            HStack() {
                Toggle("Test", isOn: $viewModel.isOn)
                    .toggleStyle(SwitchToggleStyle(tint: Color.red))
            }
            
            if (viewModel.showRow) {
                Text("Hello Second World")
            }
       }.listStyle(GroupedListStyle())
    }
}

它可能會更好,以保持與動畫相關的邏輯(如withAnimation )的視圖

一種可能的解決方案是創建自定義Binding

struct ContentView: View {
    @StateObject var viewModel = ViewModel()

    var binding: Binding<Bool> {
        .init(get: {
            viewModel.showRow
        }, set: { newValue in
            withAnimation {
                viewModel.showRow = newValue
            }
        })
    }

    var body: some View {
        List {
            Text("Text")
            Toggle("Toggle", isOn: binding)
                .toggleStyle(SwitchToggleStyle(tint: Color.red))
            if viewModel.showRow {
                Text("Hidden Text")
            }
        }
        .listStyle(GroupedListStyle())
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM