5

我在 SwiftUI 表单中使用 DatePickers 获得了一些奇怪的动画行为。一张图片值一千字,所以我确定一个视频值一百万字:https ://imgur.com/a/UHXqXOh

我试图让日期选择器在表单中展开然后折叠,就像在 Calendar.app 中创建新事件时的行为一样

发生在我身上的是:

  1. Section中的任何扩展项目(除了最后一个)都会正常打开,但是当它关​​闭时,扩展的部分会向下滑动并淡出,而不是向上滑动和淡出。
  2. 该部分中的最后一项可以正确滑动,但根本不会褪色。它只是在过渡的开始/结束时出现然后消失

这些行为仅在表单某处存在非 DatePicker 元素(例如 Text、Slider)时才会发生(不必在该特定部分中)

这是我的内容视图:

struct ContentView: View {
    @State var date = Date()
    @State var isDateShown = false
    var body: some View {
            Form {
                Section(header: Text("Title")) {
                    DatePicker("Test", selection:$date)
                    DatePicker("Test", selection:$date)
                    Text("Pick a date").onTapGesture {
                        withAnimation {
                            self.isDateShown.toggle()
                        }
                       
                    }
                    if(isDateShown) {
                        DatePicker("", selection: $date).datePickerStyle(WheelDatePickerStyle()).labelsHidden()
                    }
                    
                }
                Section(header: Text("hello")) {
                    Text("test")
                }
        }
        
    }
}

乐于提供其他所需的东西

4

3 回答 3

7

以下是 iOS <14 的两种可能的解决方法:1) 简单的一种是完全禁用动画,2) 复杂的一种是通过注入自定义动画修饰符来缓解不正确的动画

使用 Xcode 11.4 / iOS 13.4 测试

1)简单的解决方案- 包装DatePicker到容器中并将动画设置为 nil

演示1

VStack {
    DatePicker("Test", selection:$date).id(2)
}.animation(nil)

2) 复杂的解决方案-DatePicker使用 a) 视图偏好阅读器ViewHeightKey和 b) 使用我的其他解决方案中的 AnimatingCellHeight 显式地为该帧设置动画。

演示2

struct TestDatePickersInForm: View {
    @State var date = Date()
    @State var isDateShown = false
    @State private var height = CGFloat.zero
    var body: some View {
            Form {
                Section(header: Text("Title")) {
                    // demo of complex solution
                    VStack {
                        DatePicker("Test", selection:$date).id(1)
                            .background(GeometryReader {
                                Color.clear.preference(key: ViewHeightKey.self,
                                    value: $0.frame(in: .local).size.height) })
                    }
                    .onPreferenceChange(ViewHeightKey.self) { self.height = $0 }
                    .modifier(AnimatingCellHeight(height: height))
                    .animation(.default)

                    // demo of simple solution
                    VStack {
                        DatePicker("Test", selection:$date).id(2)
                    }.animation(nil)

                    Text("Pick a date").onTapGesture {
                        withAnimation {
                            self.isDateShown.toggle()
                        }

                    }
                    if(isDateShown) {
                        DatePicker("", selection: $date).datePickerStyle(WheelDatePickerStyle()).labelsHidden().id(3)
                    }

                }
                Section(header: Text("hello")) {
                    Text("test")
                }
        }

    }
}
于 2020-06-30T05:42:56.240 回答
0

很有趣.. 有了新的测试版,他们显然改变了 DatePicker。

在此处输入图像描述

因此,如果您仅对 iOS 14+ 没有任何问题...

于 2020-06-25T11:05:55.680 回答
0

最接近的解决方案是将日期选择器移动到自己的部分

Form {
            Section(header: Text("Title")) {
                
                DatePicker(selection:$date1, label: {Text("Test")}    )
                
            }
            DatePicker("Test", selection:$date2)
            Section{
                Text("Pick a date").onTapGesture {
                    withAnimation {
                        self.isDateShown.toggle()
                    }
                    
                }
                if(isDateShown) {
                    DatePicker("", selection: $date3).datePickerStyle(WheelDatePickerStyle()).labelsHidden()
                }
            }
            Section(header: Text("Hello")){
                Text("Hello")
            }
        }
于 2020-06-26T00:53:16.890 回答