Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift UIScreenedGerenergesture光滑如野生动物园_Swift_Animation_Uigesturerecognizer - Fatal编程技术网

Swift UIScreenedGerenergesture光滑如野生动物园

Swift UIScreenedGerenergesture光滑如野生动物园,swift,animation,uigesturerecognizer,Swift,Animation,Uigesturerecognizer,我的容器视图控制器有一个屏幕边缘平移手势来更改视图。用于平移视图的代码如下所示: func changeView(recognizer: UIScreenEdgePanGestureRecognizer) { println("INITIAL: \(recognizer.translationInView(view))") if recognizer.state == .Began { // Create and configure the view

我的容器视图控制器有一个屏幕边缘平移手势来更改视图。用于平移视图的代码如下所示:

func changeView(recognizer: UIScreenEdgePanGestureRecognizer) {

    println("INITIAL: \(recognizer.translationInView(view))")

    if recognizer.state == .Began {
        // Create and configure the view

        println("BEGAN: \(recognizer.translationInView(view))")
    }

    if recognizer.state == .Changed {
        println("CHANGED: \(recognizer.translationInView(view))")

        let translation = recognizer.translationInView(view)

        currentView.view.center.x += translation.x
        pendingView.view.center.x += translation.x

        recognizer.setTranslation(CGPointZero, inView: view)
    }

    if recognizer.state == .Ended {
        if recognizer.view!.center.x > view.bounds.size.width {
            // Animate the view to position
        } else {
            // Animate the view back to original
        }
    }
}
虽然这样做有效,但我仍然对平移的开始有问题。当用户快速滑动时,
translation
将有一个足够大的值,使平移开始看起来“不平稳”

例如,快速滑动
翻译
将以
100
值开始。然后将该值添加到视图的
center.x
,从而产生不期望的效果

我注意到Safari也有一个屏幕边缘手势来改变视图,无论滑动速度有多快,这种效果都不会发生。对于正常的
ui感知识别器
,也不会发生这种情况

我已尝试在
UIView.animateWithDuration()
中包装“动画”。它确实看起来更平滑,但感觉只是落后于实际的姿势,不像在Safari中那样

有人能告诉我一个更好的方法来平移视图,这样它看起来就像狩猎一样平滑吗

编辑:
我添加了几行来检查翻译的值,问题是它从
0
跳到某个值,从而导致不需要的行为。无论我把
recognizer.setTranslation(CGPointZero,inView:view)放在哪里

输出为:

INITIAL: (21.5, 0.0)
BEGAN:   (21.5, 0.0)
INITIAL: (188.0, -3.0)
CHANGED: (188.0, -3.0)
经过更多的测试:

func changeView(recognizer: UIScreenEdgePanGestureRecognizer) {
    println("INITIAL: \(recognizer.translationInView(view))")
    recognizer.setTranslation(CGPointZero, inView: view)
}

INITIAL: (0.0, 0.0)
INITIAL: (130.5, -35.5)
最终版本:
似乎创建和准备新视图会在
开始时造成一些小的延迟。少量的延迟足以在翻译中产生100-200的差异


我想可能需要在其他地方预加载视图。

这并不能解决所有问题,因为正如您所说的,屏幕边缘平移手势识别器的行为有点不稳定;但请注意,您忽略了一条有价值的数据—识别器的问题。TranslationView
处于
开始
状态。显然,当时手指已经动了很多;因为,如果不是这样,我们就不会将其视为屏幕边缘平移手势!因此,我认为,如果你像这样构建你的测试,你会更快乐:

    switch recognizer.state {
    case .Began:
        // ... do initial setup
        fallthrough // <-- TAKE NOTE
    case .Changed:
        // respond to changes
    default:break
    }
(第一个,前面是
开始
,是执行
更改
故障
)因此是的,我们从零到-41的速度非常快,但至少有一个中间值-16.5,所以它不是很突然


我还要补充一点,如果有严重的延迟和跳跃,很可能是您有多个相互冲突的手势识别器。如果是这样,您可以通过使用代理方法来检测这一事实,例如
GestureRecognitzer:shouldRequiredFilureOfGestureRecognitzer:
——这也可以让您在它们之间确定优先级,并可能使其他g.r.更快地让位。

非常有趣。我没有想过在这里使用fall-through,我已经尝试了很多不同的选择。晚饭后测试:)我已经按照你的建议进行了测试,但不幸的是,它仍然保持不变。我在我的帖子中添加了一个编辑,说明了原因(我想)。编辑也是根据你的建议完成的,只是没有改变整个问题。好吧,也许还有别的事情发生了,因为我的测试与你的不一致(我在我的答案中添加了一些日志记录结果)。你的手势识别器是否与其他东西冲突,以至于决定识别需要花费很多时间?我正要更新我的问题。创建视图似乎导致了
开始时的某种延迟。我想我必须在其他地方预加载视图?(创建新视图需要使用
过滤器
4或5次,传递一些值和通常的子/父设置)只需使用委托方法对冲突的手势识别器进行优先级排序即可。-我会在我的回答中补充这一点。非常感谢。我一遍又一遍地读你的台词,害怕因为不理解而让你不安:顺便说一句,一个小的离题问题。希望这里可以。你的最新著作推荐给初学者/中间人吗?我只想说:我的答案中的所有内容都是直接从书中出来的。
began
changed
(-16.5, 0.0)
changed
(-41.5, 0.0)
changed
(-41.5, 0.0)
changed
(-58.5, 0.0)