假设我有一个 View ,我希望它是可拖动的。仅使用 UIKit,我将使用以下逻辑的变体来实现它。
var viewStartY: CGFloat = 0
var panStartY: CGFloat = 0
func handlePan(recognizer: UIPanGestureRecognizer) {
var location = recognizer.locationInView(someView)
if recognizer.state == .Began {
viewStartY = someView.frame.origin.y
panStartY = location.y
}
let delta = location.y - panStartY
someView.frame.origin.y = viewStartY + delta.y
}
现在我想知道是否有一种方法可以处理像 viewStartY 这样的值,这些值必须在手势开始时存储,同时避免副作用。有没有办法让它们不断地通过管道?
最佳答案
FlatMap 可能适合您。获取一系列开始手势,并在其上绘制一系列变化的手势。这只是再次为您提供了更改流,但您可以捕获 flatMapped 函数内的 startValue。
可能解释该技术的伪代码:
let gestures = recognizer.stream // Depends on your framework
// Filter gesture events by state
let gesture_begans = gestures.filter { $0.state == .Began }
let gesture_changeds = gestures.filter { $0.state == .Changed }
// Take a stream of beginning gestures...
let gesture_deltas = gesture_begans.flatMap { (began) -> in
let startPoint = began.locationInView(outerView)
// ... and flatMap into a stream of deltas
return gesture_changeds.map { (changed) in
let changedPoint = changed.locationInView(outerView)
let delta = changedPoint.y - startPoint.y
return delta
}
}
gesture_deltas.onValue { y in innerView.frame.origin.y = y }
关于ios - 使用 ReactiveCocoa 实现 Pan Gesture 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30936395/