在同一个 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的主要内容,如果未能解决你的问题,请参考以下文章