Смещение стека SwiftUI меняется при вращении, что приводит к сбою - PullRequest
1 голос
/ 10 июля 2020

Я пытаюсь реализовать приложение, в котором пользователь может провести пальцем влево и вправо, чтобы go перейти к другому горизонтальному ScrollViews. В своем приложении я использую GeometryReader, чтобы определить, должен ли измениться текущий активный ScrollView. Я не включил это в этот пример.

Я заметил, что происходят очень странные вещи, если смещение HStack меняется с анимацией, и устройство переводится в альбомный режим. Мало того, что приложение «трескает» sh, телефон тоже полностью перестает отвечать!

Я пробовал это на iOS 13.5 и 13.6. iOS 14 даже не распознает одновременный жест (почему?). Я думаю, что проблема возникает из-за .offset.

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

Спасибо!

struct ContentView: View {
    
    @State var offset: CGFloat = UIScreen.main.bounds.width/2
    
    var body: some View {
        
        HStack{
            ScrollView(.horizontal){
                Text("Test")  
            }
          .simultaneousGesture(DragGesture()
                          .onChanged{ translation in
                            print("triggered")
                            if(translation.predictedEndTranslation.width < 50){
                                withAnimation(.easeInOut(duration: 5)){
                                    self.offset = -UIScreen.main.bounds.width/2
                                }
                            }
                          }
                      )
                      
            .frame(width: UIScreen.main.bounds.width)
            
            ScrollView(.horizontal){
                Text("Test2")
            }
            .simultaneousGesture(DragGesture()
                                     .onChanged{ translation in
                                        print("triggered")
                                       if(translation.predictedEndTranslation.width > 50){
                                           withAnimation(.easeInOut(duration: 5)){
                                               self.offset = UIScreen.main.bounds.width/2
                                           }
                                       }
                                     }
                                 )
        }
        .frame(width: UIScreen.main.bounds.width * 2)
        .offset(x: self.offset)  
    }
}

Другой пример с использованием .position вместо оф. (работает на iOS 14, но не ниже):

struct ContentView: View {
    
    @State var offset: CGFloat = UIScreen.main.bounds.width
    
    var body: some View {
        
        
        HStack{
            ScrollView(.horizontal){
                
                Button(action: {
                    withAnimation(.easeInOut(duration: 5)){
                        self.offset = 0
                    }
                })
                {
                    Circle()
                        .foregroundColor(.green)
                        .frame(width: 100, height: 100)
                }
            }
                  
            .frame(width: UIScreen.main.bounds.width)
            
            ScrollView(.horizontal){
                
                Button(action: {
                    withAnimation(.easeInOut(duration: 5)){
                        self.offset = UIScreen.main.bounds.width
                    }
                })
                {
                    Circle()
                        .frame(width: 100, height: 100)
                        .foregroundColor(.red)
                }
            } .frame(width: UIScreen.main.bounds.width)
        }
               
        .frame(width: UIScreen.main.bounds.width * 2)
        .position(x: self.offset, y: 300)
    }
}
...