Я пытаюсь реализовать приложение, в котором пользователь может провести пальцем влево и вправо, чтобы 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)
}
}