作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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 = PinchGestureValue
和
PinchGesture.Body = AnyGesture<PinchGestureValue>
.那么可以证明
AnyGesture<PinchGestureValue>.Value == PinchGesture.Value
,所以它可以使用
_makeGesture
的默认实现由 SwiftUI 提供。
PinchGesture
.最终,您的
body
仍然仅限于结合 SwiftUI 的原始手势,这不能让您访问当前的
UIEvent
或
UITouch
对象。
关于ios - 有没有办法在 SwiftUI 中创建新的手势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64089401/
我是一名优秀的程序员,十分优秀!