我有一个带有定制图表视图(不是iOS 16图表)的SwiftUI-Form.长按可切换到不同类型的图表.这些图表使用.transition(.slide)修改器.在iOS 15中,这些都像媒体预期的那样发生了转变,但在iOS 16中却并非如此.

持久化状态属性(枚举):

@AppStorage("chartType") var chartType: ChartType = .chartA

body号房产的第Form部分:

Form {
    
    // Other sections
    
    Section {
        switch chartType {
            case .chartA:
                ChartViewA()
                    .transition(.slide)
            case .chartB:
                ChartViewB()
                    .transition(.slide)
    }
        .onLongPressGesture {
            if chartType == .chartA {
                withAnimation {
                    summaryChartType = .chartB
                }
            } else {
                withAnimation {
                    summaryChartType = .chartA
                }
            }
        }

不幸的是,添加像.animation(.spring(), value: chartType)这样的动画修改器不会有什么不同.

如果你能给我一些建议,告诉我为什么这在iOS15中能行得通,但在iOS16中不行,以及我能做些什么来恢复这里的动画,我将不胜感激.

推荐答案

在iOS 16中,@AppStorage个变量和动画似乎存在问题.以下是一种可能的解决方法.使用@State var作为动画,并将其保存为带有.onChange()@AppStorage变量:

enum ChartType: String {
    case chartA, chartB
}

struct ChartViewA: View {
    var body: some View {
        Color.red
    }
}

struct ChartViewB: View {
    var body: some View {
        Color.blue
    }
}

struct ContentView: View {
    @AppStorage("chartType") var chartTypeAS: ChartType = .chartA
    @State private var chartType: ChartType = .chartA
    
    init() {
        // load initial value from persistent storage
        _chartType = State(initialValue: chartTypeAS)
    }
    
    var body: some View {

        Form {
            
            // Other sections
            
            Section {
                VStack {
                    switch chartType {
                    case .chartA:
                        ChartViewA()
                            .transition(.slide)
                    case .chartB:
                        ChartViewB()
                            .transition(.slide)
                    }
                }
                .onLongPressGesture {
                    if chartType == .chartA {
                        withAnimation {
                            chartType = .chartB
                        }
                    } else {
                        withAnimation {
                            chartType = .chartA
                        }
                    }
                }
            }
            .onChange(of: chartType) { value in
                // persist chart type
                chartTypeAS = value
            }
        }
    }
}

在Xcode 14.0和运行iOS 16的iPhone 14模拟器上进行了测试.

或者,您也可以手动执行保存到UserDefaults或从UserDefaults恢复.

Ios相关问答推荐

SwiftUI文本编辑器内部滚动填充,无需文本裁剪

滚动时突出显示工具栏项目

TrueDepth摄像机像素距离不准确

将数据传回VC时委托为空

SwiftUI Divider过大了其父视图

UITableViewCell编程约束问题

如何使用 SwiftData 从列表中删除子项目?

在 SwiftUI 中以编程方式插入内嵌图像

SwiftUI:同时拖动父视图和子视图,但手指分开

在 SwiftUI 中重构提取到子视图的 GeometryReader 代码

SwiftUI 解除 .alert 弹出 NavigationView

使用 @MainActor 更新 UI 的适当策略是什么?

async/await、Task 和 [weak self]

通过MatchedGeometryEffect向上滑动视图

Xcode 8,iOS 10 -为进程启动 WebFilter 日志(log)记录

光标未显示在 UITextView 中

如何比较两个 UIImage 对象

AVAudioRecorder 抛出错误

如何为 UILabel 的背景 colored颜色 设置动画?

iOS 中的 Google Analytics SDK 3.0 _sqlite3 链接器错误