在同一个 UIImageView 上处理/检测 UIPanGestureRecognisor 和 UISwipeGestureRecognisor

Posted

技术标签:

【中文标题】在同一个 UIImageView 上处理/检测 UIPanGestureRecognisor 和 UISwipeGestureRecognisor【英文标题】:Handle / Detect UIPanGestureRecognisor and UISwipeGestureRecognisor on same UIImageView 【发布时间】:2014-07-15 12:08:48 【问题描述】:

我有一个图片库,如果用户单击图片,它会出现在全屏 ImageView 中,

现在如果用户使用 UIPinchGesture 图片可以完美放大/缩小。

如果图片未缩放,我想实现 UISwipeGesture 应该可以工作并且在滑动手势上调用图库中的下一个图像。

如果图片被缩放然后 swipeGesture 停止工作,UIPanGesture 应该工作。

实现它的最佳方法是什么,

我正在这样做。但总是混合使用 PanGesture 和 SwipeGesture。

我的刷卡处理方法

- (void)handleSwipe:(UIGestureRecognizer *)sender

    if (stopSwipe == true) // bool iVar (stopSwipe)
    
        return;
    
    UISwipeGestureRecognizerDirection direction = [(UISwipeGestureRecognizer *) sender direction];
    switch (direction)
    
        case UISwipeGestureRecognizerDirectionLeft:
            newIndexPath = [NSIndexPath indexPathForRow:myIndexPath.row+1 inSection:myIndexPath.section];
            [self ChangeImage];
            myIndexPath = [NSIndexPath indexPathForRow:myIndexPath.row+1 inSection:myIndexPath.section];
            break;
        case UISwipeGestureRecognizerDirectionRight:
            newIndexPath = [NSIndexPath indexPathForRow:myIndexPath.row-1 inSection:myIndexPath.section];
            [self ChangeImage];
            myIndexPath = [NSIndexPath indexPathForRow:myIndexPath.row-1 inSection:myIndexPath.section];
            break;
        default:
            break;
    

我的捏捏处理方法

-(void)handlePinch:(UIPinchGestureRecognizer*)sender

static CGRect initialBounds;
if (sender.state == UIGestureRecognizerStateBegan)

    initialBounds = myLrgImageView.bounds;

CGFloat factor = [(UIPinchGestureRecognizer *)sender scale];

CGAffineTransform transform = CGAffineTransformScale(CGAffineTransformIdentity, factor, factor);
myLrgImageView.bounds = CGRectApplyAffineTransform(initialBounds, transform);

我的平移处理方法

-(void)handlePan:(UIPanGestureRecognizer*)recognizer

    //after pinch 'myLrgImageView.frame' is changed.
    //imgActualBoundry is the normal size with out zooming.
    if ([NSValue valueWithCGRect:myLrgImageView.frame] > [NSValue valueWithCGRect:imgActualBoundry])
    
        stopSwipe = true;
        CGPoint translation = [recognizer translationInView:self.myLrgImageView];
        recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,
                                         recognizer.view.center.y + translation.y);
       [recognizer setTranslation:CGPointMake(0, 0) inView:self.myLrgImageView];

       if (recognizer.state == UIGestureRecognizerStateEnded)
       
           CGPoint velocity = [recognizer velocityInView:self.myLrgImageView];
           CGFloat magnitude = sqrtf((velocity.x * velocity.x) + (velocity.y * velocity.y));
           CGFloat slideMult = magnitude / 200;
           NSLog(@"magnitude: %f, slideMult: %f", magnitude, slideMult);

           float slideFactor = 0.1 * slideMult; // Increase for more of a slide
           CGPoint finalPoint = CGPointMake(recognizer.view.center.x + (velocity.x * slideFactor),
                                         recognizer.view.center.y + (velocity.y * slideFactor));
           finalPoint.x = MIN(MAX(finalPoint.x, 0), self.myLrgImageView.bounds.size.width);
           finalPoint.y = MIN(MAX(finalPoint.y, 0), self.myLrgImageView.bounds.size.height);
        
    
    else
    
        stopSwipe = false;
    

我尝试过或不使用这种同时使用多个手势的方法,但没有成功。

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer

    return YES;

【问题讨论】:

您是否为两个识别器设置了委托?否则永远不会调用“shouldRecognizeSimultaneously”方法 @Cabus 是的,我设置了这些代表 【参考方案1】:

我从您的问题中得出的结论是:您想在相同的UIImageView 上使用平移和滑动手势,但要在特定条件下使用。

如果我说我只是一个懒惰的人,首先只需在 iVar 中获取图像的实际大小然后检查两个委托方法:

if size is changed then you will surely like to use Pan gesture on same Image.
&
if size is the same as actual image then Swipe. 

我只是发布一个想法来继续你。

抱歉没有发布代码,实际上面临电力短缺和笔记本电脑电池即将耗尽。 :P

【讨论】:

你的想法很好,可以理解。我已经按照您的建议解决了这个问题。很高兴在很长一段时间后在这个帖子上见到你。谢谢 我接受了这个答案,因为我也使用了你的技巧。但有趣的是在你的建议之前。 :P ;) 如果您找到任何问题/问题的解决方案,您也可以添加它的答案。如果有解决方案,回答您自己的问题也不错。

以上是关于在同一个 UIImageView 上处理/检测 UIPanGestureRecognisor 和 UISwipeGestureRecognisor的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中检测 UIImageView 上的 UIImageView 更改或 KVO 炒锅

如何检测两个 UIImageView 何时重叠?

在 Swift 中检测 UIImageView 触摸

如何在动画过程中检测UIImageView上的点击?

uiimageview的长按手势和移动?

UIImageView 子类触摸检测