我正在尝试创建一个应用程序,它复制Apple的照片应用程序(iPhone)缩放,平移和滚动照片图像的能力。 (我还想在查看pdf和其他文档时使用相同的控件。)我得到了点击手势来显示/隐藏导航栏和滑动手势以从左到右滚动图像&反之亦然。然后我得到了缩放手势来放大和缩小,但是当我添加平移手势以在缩放图像内移动时,滑动手势退出工作。
我在StackOverflow的其他地方找到了潜在的解决方案,包括使用shouldRecognizeSimultaneouslyWithGestureRecognizer
,但到目前为止我还没能解决冲突。有什么建议吗?
以下是代码:
func gestureRecognizer(UIPanGestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer UISwipeGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
@IBAction func handlePinch(sender: UIPinchGestureRecognizer) {
sender.view!.transform = CGAffineTransformScale(sender.view!.transform, sender.scale, sender.scale)
sender.scale = 1
}
@IBAction func handlePan(sender: UIPanGestureRecognizer) {
self.view.bringSubviewToFront(sender.view!)
var translation = sender.translationInView(self.view)
sender.view!.center = CGPointMake(sender.view!.center.x + translation.x, sender.view!.center.y + translation.y)
sender.setTranslation(CGPointZero, inView: self.view)
}
@IBAction func handleSwipeRight(sender: UISwipeGestureRecognizer) {
if (self.index == 0) {
self.index = ((photos.count) - 1);
}
else
{
self.index--;
}
// requireGestureRecognizerToFail(panGesture)
setImage()
}
答案 0 :(得分:3)
您不希望shouldRecognizeSimultaneouslyWithGestureRecognizer:
(允许两个手势同时发生)。如果你想要,例如,同时捏和平移,这是有用的。但是,在您同时平移和滑动的情况下,同时手势将无济于事。 (如果有的话,同时认识到这些可能会使情况混乱。)
相反,您可能希望使用requireGestureRecognizerToFail:
建立滑动和平移手势的优先级(例如,只有在滑动失败时才进行平移)。
或者更好的是,完全退出滑动手势并仅使用平移手势,如果您缩小将是一个交互式手势,从一个图像导航到下一个图像,如果放大,则平移图像。无论如何,交互式平移手势通常是更令人满意的用户体验;例如,如果从一张照片滑动到下一张照片,则能够停止中间平移手势并返回。如果您查看Photos.app,它实际上是使用平移手势从一个图像滑动到另一个图像,而不是滑动手势。
答案 1 :(得分:0)
我在http://www.raywenderlich.com/76436/use-uiscrollview-scroll-zoom-content-swift发现了一个教程,它很好地介绍了UIScrollView作为一种在Swift中结合缩放,平移和分页的方法。对于试图学习如何使这些手势很好地协同工作的人,我推荐它。
答案 2 :(得分:0)
在类似的情况下,我使用了另一种方法:扩展平移手势以支持滑动:
// in handlePan()
switch recognizer.state {
struct Holder {
static var lastTranslate : CGFloat = 0
static var prevTranslate : CGFloat = 0
static var lastTime : TimeInterval = 0
static var prevTime : TimeInterval = 0
}
case .began:
Holder.lastTime = Date.timeIntervalSinceReferenceDate
Holder.lastTranslate = translation.y
Holder.prevTime = Holder.lastTime
Holder.prevTranslate = Holder.lastTranslate
//perform appropriate pan action
case .changed:
Holder.prevTime = Holder.lastTime
Holder.prevTranslate = Holder.lastTranslate
Holder.lastTime = Date.timeIntervalSinceReferenceDate
Holder.lastTranslate = translation.y
//perform appropriate pan action
case .ended ,.cancelled:
let seconds = CGFloat(Date.timeIntervalSinceReferenceDate) - CGFloat(Holder.prevTime)
var swipeVelocity : CGFloat = 0
if seconds > 0 {
swipeVelocity = (translation.y - Holder.prevTranslate)/seconds
}
var shouldSwipe : Bool = false
if Swift.abs(swipeVelocity) > velocityThreshold {
shouldSwipe = swipeVelocity < 0
}
if shouldSwipe {
// perform swipe action
} else {
// perform appropriate pan action
}
default:
print("Unsupported")
}
您需要做的就是为滑动手势找到合适的velocityTreshold