gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 01:55:19 27 4
gpt4 key购买 nike

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

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