gpt4 book ai didi

ios - 有没有办法在 SwiftUI 中创建新的手势?

转载 作者:行者123 更新时间:2023-12-04 12:57:44 24 4
gpt4 key购买 nike

SwiftUI 缺少​​平移手势(即缩放和偏移),所以我试图创建一个。但是,似乎 Gesture 结构依赖于私有(private)类。例如:

public struct PinchGesture: Gesture {

public struct PinchGestureValue: Equatable {
var scale: CGFloat
var anchor: UnitPoint
var offset: CGSize
var isPinching: Bool
}

public typealias Value = PinchGestureValue
public typealias Body = Never

var minimumScaleDelta: CGFloat
var minimumDistance: CGFloat
var coordinateSpace: CoordinateSpace


public init(minimumScaleDelta: CGFloat = 0.01, minimumDistance: CGFloat = 10, coordinateSpace: CoordinateSpace = .local) {
self.minimumScaleDelta = minimumScaleDelta
self.minimumDistance = minimumDistance
self.coordinateSpace = coordinateSpace
}

public static func _makeGesture(gesture: _GraphValue<PinchGesture>, inputs: _GestureInputs) -> _GestureOutputs<PinchGestureValue> {
// Unable to complete
}

}
此代码无法完成,因为 _GraphValue、_GestureInputs 和 _GestureOutputs 是私有(private)的。在我完全屈服之前,我想看看是否有人找到了解决方法。

最佳答案

SwiftUI 提供了 _makeGesture 的默认实现。 :

extension Gesture where Self.Value == Self.Body.Value {
public static func _makeGesture(gesture: SwiftUI._GraphValue<Self>, inputs: SwiftUI._GestureInputs) -> SwiftUI._GestureOutputs<Self.Body.Value>
}
这里的难点是约束 Self.Value === Self.Body.Value .这意味着你的手势 body不能声明返回 some Gesture , 因为 some Gesture不能满足约束(即使它的 Value 匹配)。所以你要给 body特定类型。最简单的解决方案是使用 AnyGesture类型橡皮擦:
public struct PinchGesture: Gesture {

...

public var body: AnyGesture<PinchGestureValue> {
AnyGesture(
DragGesture(minimumDistance: 0, coordinateSpace: .global)
.map { PinchGestureValue($0) }
)
}
}
在这段代码中,Swift 可以推断 PinchGesture.Value = PinchGestureValuePinchGesture.Body = AnyGesture<PinchGestureValue> .那么可以证明 AnyGesture<PinchGestureValue>.Value == PinchGesture.Value ,所以它可以使用 _makeGesture 的默认实现由 SwiftUI 提供。
不幸的是,我怀疑您是否可以使用它来创建您的 PinchGesture .最终,您的 body仍然仅限于结合 SwiftUI 的原始手势,这不能让您访问当前的 UIEventUITouch对象。

关于ios - 有没有办法在 SwiftUI 中创建新的手势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64089401/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com