Хорошо, так что мне удалось найти решение, которое работает. Изменяя непрозрачность элементов списка, когда происходит изменение источника данных списка.
Установка его в 0, когда нежелательная анимация по умолчанию воспроизводится, и возвращение его в 1, когда мои желаемые анимации начинают воспроизводиться.
Таким образом, я могу скрыть анимацию списка по умолчанию, не удаляя свою собственную. Желаемая анимация:)
import SwiftUI
struct CurrencyComparison: View {
@State var mainArray = ["10", "10","10", "10", "10", "10", "10", "10", "10", "10"]
@State var array = ["10", "10","10", "10", "10", "10", "10", "10", "10", "10"]
@State var secondArray = ["20", "20","20", "20", "20", "20", "20", "20", "20", "20"]
@State var toggleHide = false
@State var direction = false
@State var triggerAnimation: Bool
var body: some View {
VStack {
List (self.mainArray, id:\.self) { item in
Text(item)
.foregroundColor(Color.black)
.frame(width: 40, height: 80)
.padding(.leading, 80)
.isHidden(self.toggleHide)
.opacity(self.toggleHide ? 0 : 1)
Spacer()
Text(item)
.foregroundColor(Color.black)
.frame(width: 40, height: 40)
.padding(.trailing, 80)
.isHidden(self.toggleHide)
.opacity(self.toggleHide ? 0 : 1)
}
.background(LinearGradient(gradient: Gradient(colors: [Color.blue, Color.red]), startPoint: .center, endPoint: .center))
.animation(Animation.spring().delay(triggerAnimation ? 0 : 0.4))
.transition(.asymmetric(insertion: AnyTransition.opacity.combined(with: .move(edge: .trailing)), removal: .move(edge: .trailing)))
.cornerRadius(30)
.padding(.top, 30)
.padding(.bottom, 30)
.shadow(radius: 10)
.gesture(
DragGesture(minimumDistance: 50)
.onEnded { value in
self.toggleHide.toggle()
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
if self.mainArray == self.array {
self.mainArray = self.secondArray
} else {
self.mainArray = self.array
}
}
DispatchQueue.main.asyncAfter(deadline: .now() + 0.9) {
self.toggleHide.toggle()
}
}
)
}
.frame(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height + 50, alignment: .top)
.background(Color.gray.aspectRatio(contentMode: .fill))
.padding(.top, 120)
}
}
struct CurrencyComparison_Previews: PreviewProvider {
@State static var staticBool = true
static var previews: some View {
CurrencyComparison(triggerAnimation: true)
}
}
extension View {
func isHidden(_ bool: Bool) -> some View {
modifier(HiddenModifier(isHidden: bool))
}
}
private struct HiddenModifier: ViewModifier {
fileprivate let isHidden: Bool
fileprivate func body(content: Content) -> some View {
Group {
if isHidden {
content.hidden()
} else {
content
.transition(.asymmetric(insertion: AnyTransition.opacity.combined(with: .slide), removal: .move(edge: .trailing)))
}
}
}
}