带有@GestureState的动画对象

问题描述 投票:0回答:1

我试图在用户使用手势移动 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

ios swift swiftui gesture gesture-state
1个回答
0
投票
因此,尝试为

offset 添加另一个 .animation

 修饰符:

offset

顺便说一句,我建议更传统的做法是使用 
VStack(spacing: 40) { //... } .animation(.default, value: isDragging) .animation(.easeInOut(duration: 0.1), value: offset) // 👈 here
 来表示手势期间正在变化的值,而不是使用表示手势正在发生的布尔标志。这样就不需要额外的 
GestureState

修饰符。
以下是如何通过使用 

.onChanged

 作为拖动偏移来重构您的示例。

布尔标志

GestureState

源自拖动偏移(如果偏移非零则设置为true)。

  • 动画修改器也应用得更具体。

    
    

    isDragging
© www.soinside.com 2019 - 2024. All rights reserved.