2014-11-03 151 views
2

我试图创造出复制苹果的照片应用程序(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() 
} 

回答

3

你不想shouldRecognizeSimultaneouslyWithGestureRecognizer:(允许两个手势同时发生)。例如,如果你想同时捏和平移,这很有用。但在同时进行平移和滑动的情况下,同时进行的手势将无济于事。 (如果有的话,同时识别这些可能会使情况混淆)。

而是,您可能希望使用requireGestureRecognizerToFail:来确定滑动和平移手势的优先级(例如,只在滑动失败时平移)。或者更好的是,完全取消滑动手势并仅使用平移手势,如果缩小将是一种交互式手势,从一个图像导航到下一个,如果放大,则平移图像。无论如何,交互式平移手势通常是更令人满意的用户体验;例如,如果从一张照片滑到下一张照片,能够停止中间平移手势并返回。如果你看看Photos.app,它实际上是使用平移手势从一个图像滑动到另一个图像,而不是滑动手势。

+0

这是有道理的使用只是平底锅的手势。我已经尝试了一些东西,但我有如何检测平移左,右,以及如何获得下一个图像从右边推或留下像苹果的照片应用挣扎。你有任何代码可以帮助我复制该功能吗?谢谢!约翰 – 2014-11-12 23:18:07

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您轻扫手势