ios - 使用 ReactiveCocoa 实现 Pan Gesture 接口(interface)

标签 ios uipangesturerecognizer reactive-cocoa frp

假设我有一个 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/

相关文章:

ios - Swift iPad - 按钮不起作用

ios - 来自数组的多个多边形叠加

ios - 在某些情况下使 superview 响应 subViews Pan Gesture

ios - 试图理解 TranslationInView

swift - 为什么observeValues block 没有被调用?

ios - Swift 2 RAC4 合并 UITextField 信号和 UISwitch 信号

ios - 通过 UIActivityViewController (Twitter, Facebook, Instagram) 使用主题标签分享图片

ios - GCD 终止请求

ios - SceneKit SCNNode 跟随触摸移动

ios - @strongify 的原因是什么