我的容器视图控制器有一个屏幕边缘平移手势来更改视图。用于平移视图的代码如下所示:
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
将具有足够大的值以使平移的开始看起来不平稳"。
例如,快速滑动translation
将以值100
开头。然后将该值添加到导致意外效果的center.x
视图中。
我注意到Safari还有一个屏幕边缘手势来改变视图,无论滑动速度有多快,这种效果都不会发生。普通UIPanGestureRecognizer
也不会发生这种情况。
我试过包装"动画"在UIView.animateWithDuration()
。它确实看起来更流畅,但感觉它只是落后于实际的手势,不像它在Safari中完成的那样。
有人可以告诉我一个更好的方法来平移视图,使它看起来像在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)
FINAL:
似乎创建和准备新视图导致Began
中出现某种小的延迟。少量滞后足以产生100-200的平移差异。
可能必须在其他地方预先加载视图。
答案 0 :(得分:1)
这不会解决你所有的问题,因为正如你正确地说的那样,屏幕边缘平移手势识别器的行为有点脆弱;但请注意,您省略了一个有价值的数据 - recognizer.translationInView
状态中.Began
的问题。那个时候,显然,手指已经移动了很多;因为,如果没有,我们不会认为这是一个屏幕边缘平移手势!因此,如果您按照以下方式构建测试,那么您将会更加快乐:
switch recognizer.state {
case .Began:
// ... do initial setup
fallthrough // <-- TAKE NOTE
case .Changed:
// respond to changes
default:break
}
通过这种方式,您将捕获丢失的数据并对其进行响应,并且跳转不会那么糟糕。
我尝试登录began
和changed
,我的号码(显示translationInView
否 setTranslation
返回零)是这样的事情:
began
changed
(-16.5, 0.0)
changed
(-41.5, 0.0)
changed
(-41.5, 0.0)
changed
(-58.5, 0.0)
(第一个,前面是began
,是fallthrough
changed
的执行。)所以是的,我们确实从零开始到-41非常快,但至少在那里是-16.5的中间值,所以它不是那么突然。
另外我应该补充一点,如果有严重的延迟和跳跃,很可能是你有多个冲突的手势识别器。如果是这样,您可以通过使用委托方法(例如gestureRecognizer:shouldRequireFailureOfGestureRecognizer:
)来检测这一事实,这也可以让您在它们之间进行优先排序,也可以使另一个方法成为另一个。让步更快。