Почему переход представления DatePicker не работает должным образом?

#xcode #swiftui

Вопрос:

Если я попытаюсь открыть этот указатель даты, представление будет прыгать во время перехода, прежде чем перейти в фиксированное положение. В консоли также отображается длинное сообщение об ошибке …»Не в состоянии одновременно удовлетворять ограничениям»….

Если я только покажу .компонент даты этой проблемы нет. Является ли это внутренней проблемой? Если да, то как я могу заархивировать такое же поведение, потому что мне нужен выбор даты и времени без всплывающего окна сведений для более быстрого выбора.

Спасибо за любую помощь 🙂

https://imgur.com/a/IEy2syY (При нажатии на вторую кнопку происходит неправильный переход)

 struct ContentView: View {
    @State var toggle = false
    @State var date = Date(timeIntervalSinceNow: 0)
    var body: some View {
        ZStack{
            Button("sdflkj"){
                toggle.toggle()
            }
            VStack{
                Spacer()
                if toggle{
                    DatePicker("lsadjf", selection: $date, displayedComponents: [.date,.hourAndMinute])
                        .labelsHidden()
                        .datePickerStyle(GraphicalDatePickerStyle())
                }
            }
        }
   
    }
}
 

Ответ №1:

Похоже, это ошибка, вызванная перекрытием Button и DatePicker .


Протестировано с помощью симулятора iPhone 12

 struct ContentView: View {
    
    @State var toggle = false
    @State var date = Date(timeIntervalSinceNow: 0)
    
    var body: some View {
        ZStack{
            Button("Button"){
                // add `withAnimation()`
                withAnimation(.easeIn) {
                    toggle.toggle()
                }
            }
            .offset(y: -50) // set y offset for prevent overlapping of Button and DatePicker
            
            VStack{
                Spacer()
                if toggle {
                    DatePicker("", selection: $date, displayedComponents: [.date,.hourAndMinute])
                        .padding()
                        .labelsHidden()
                        .datePickerStyle(GraphicalDatePickerStyle())
                        .zIndex(5) // or add .zIndex for prevent overlapping of Button and DatePicker
                }
            }
        }
    }
}
 

Комментарии:

1. В приложении большего размера указатель даты должен отображаться поверх другого вида, как полноэкранная обложка, но на листе. Из-за этого я думаю, что невозможно избежать дублирования. Там я попробовал использовать ZStack и условный оператор.

2. @sheldor Я обновляю свой пост. Вы можете попробовать использовать .zindex() для этого. Однако кнопка «уволить» не будет невидимой или кликабельной, но на ней должна быть кнопка «уволить» fullScreenCover . Так что не было бы никаких проблем

3. Хорошо, я это проверил. При выполнении этого на симуляторе iPhone 11 появляется сообщение об ошибке консоли, а при выполнении на sim-карте iPhone 12 сообщения нет. Но все еще есть этот скачкообразный переход, который выглядит неправильно.

4. @sheldor Для решения этой проблемы, пожалуйста, добавьте дополнительную информацию о проблеме анимации, о которой вы говорите, добавьте еще немного кода или видео нужной анимации или анимации, которая происходит. Когда я запускаю его, анимация, кажется, работает нормально.

5. Я добавил ссылку здесь