我试图在用户使用手势移动 300x300 矩形时获取“真”值,并在完成与手势交互时获取“假”值。
在这种情况下,使用 @GestureState
似乎是合乎逻辑的
正如您在
.updating()
内部调用中看到的那样,我使用了 DragGesture
@GestureState private var isDragging: Bool = false
应更改 100x100 红色矩形的不透明度
@GestureState
一切似乎都工作正常,但是当我添加
public struct ContentView: View {
@State private var offset: CGSize = .zero
@State private var lastOffset: CGSize = .zero
@GestureState private var isDragging: Bool = false
public init() { }
public var body: some View {
VStack(spacing: 40) {
Rectangle().fill(.red)
.frame(width: 100, height: 100)
.opacity(isDragging ? 0 : 1)
Rectangle()
.frame(width: 300, height: 300)
.offset(offset)
.gesture(
DragGesture()
.updating($isDragging, body: { _, out, _ in
out = true
})
.onChanged({ value in
let currentOffset: CGSize = .init(width: lastOffset.width + value.translation.width, height: lastOffset.height + value.translation.height)
offset = currentOffset
})
.onEnded({ _ in
lastOffset = offset
})
)
}
.animation(.default, value: isDragging)
}
}
时,控制台在我使用
.animation(.default, value: isDragging)
示例AnimatablePair
无效, 可动画对>(第一: SwiftUI.AnimatablePair(第一:-23.666666666666664,第二:-19.0), 第二:SwiftUI.AnimatablePair
(第一:0.0,第二:0.0))与时间 时间(秒: 0.0) > 上次时间(秒: 0.016666666720993817)
我不明白为什么......如果我不使用动画,一切都会正常工作,否则它会告诉我这个问题...... 我哪里错了?这不是基于手势为对象设置动画的正确方法吗?还有其他方法吗?这是错误的方法吗?
我发现它有助于向受拖动手势影响的其他状态变化添加动画。在您的示例中,这意味着也将动画更改为
dragGesture
offset
添加另一个 .animation
修饰符:
offset
顺便说一句,我建议更传统的做法是使用
VStack(spacing: 40) {
//...
}
.animation(.default, value: isDragging)
.animation(.easeInOut(duration: 0.1), value: offset) // 👈 here
来表示手势期间正在变化的值,而不是使用表示手势正在发生的布尔标志。这样就不需要额外的
GestureState
修饰符。以下是如何通过使用 .onChanged
作为拖动偏移来重构您的示例。布尔标志
GestureState
源自拖动偏移(如果偏移非零则设置为true)。
isDragging