【问题标题】:pan gesture of UIImageView interfers the scrollUIImageView 的平移手势干扰滚动
【发布时间】:2013-04-12 04:57:49
【问题描述】:

我想实现对图像视图的平移手势功能,这个图像视图是滚动视图的子视图。问题是当我尝试滚动滚动视图时,图像视图的平移手势被识别,并且滚动视图不滚动。 请帮我解决这个问题。

这是将 pan 初始化为 uiimageview 的代码:

UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)];
            [panRecognizer setMinimumNumberOfTouches:1];
            [panRecognizer setMaximumNumberOfTouches:1];
            [panRecognizer setDelegate:self];
            [[[scrollView subviews] objectAtIndex:i] addGestureRecognizer:panRecognizer];

imageview 的用户设置为“YES”

和它的动作

-(void)move:(UIPanGestureRecognizer *)sender
{
    [[[[[sender view] superview] superview] superview]  bringSubviewToFront:sender.view];


    if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateBegan) {

        if ([[[sender view] superview] superview] == itemView) // adds the imageview in the item scroll
        {
            int tag = [[sender view] tag] / 100;
            UIScrollView *tempScroll = (UIScrollView *)[itemView viewWithTag:-tag];
            CGRect frame = CGRectFromString([itemFrameDict objectForKey:[NSString stringWithFormat:@"%i",[[sender view] tag]]]);

            CGAffineTransform transform = temp.transform;
            UIImageView *tempImageView =  [[UIImageView alloc] initWithImage: [(UIImageView *) [sender view] image]];
            tempImageView.tag = [[sender view] tag];
            //NSLog(@"[sender view] superview] : %@", [[sender view] superview]);
            tempImageView.frame = frame;
            [tempImageView setTransform:transform];
            [tempImageView setFrame:frame];
            [tempImageView setUserInteractionEnabled:YES];
            [tempScroll addSubview:tempImageView];

            UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)];
            [panRecognizer setMinimumNumberOfTouches:1];
            [panRecognizer setMaximumNumberOfTouches:1];
            [panRecognizer setDelegate:self];
            [tempImageView addGestureRecognizer:panRecognizer];

            UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];
            [singleTapGestureRecognizer setNumberOfTapsRequired:1];
            [tempImageView addGestureRecognizer:singleTapGestureRecognizer];
        }
    }

    if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateChanged)
    {
        CGPoint translatedPoint = [sender locationInView:[[sender view] superview]] ;
        newTranslatedPoint = [[[sender view] superview] convertPoint:translatedPoint toView:self.view];

        if ([sender view].frame.size.width == 35 && [sender view].frame.size.height == 35)
            [[sender view] sizeToFit];

        [sender view].center =  CGPointMake(newTranslatedPoint.x, newTranslatedPoint.y); //startFrame;

        [self.view addSubview:[sender view]];
    }

    if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded)
    {
        CGPoint newPoint = [[[sender view] superview] convertPoint:newTranslatedPoint toView:itemView];
        if (newPoint.y < 0)// || !viewUp)
        {
            //NSLog(@" baseView");
            [baseView addSubview:[sender view]];

            UITapGestureRecognizer *doubleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleDoubleTap:)];
            [doubleTapGestureRecognizer setNumberOfTapsRequired:2];
            [[sender view] addGestureRecognizer:doubleTapGestureRecognizer];

            UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scale:)];
            [pinchRecognizer setDelegate:self];
            [[sender view] addGestureRecognizer:pinchRecognizer];

            UIRotationGestureRecognizer *rotationRecognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotate:)];
            [rotationRecognizer setDelegate:self];
            [[sender view] addGestureRecognizer:rotationRecognizer];
        }

        else if (newPoint.y > 0)// && viewUp )
        {
            //NSLog(@" itemView");
            int tag = [[sender view] tag] / 100;
            UIScrollView *tempScroll = (UIScrollView *)[itemView viewWithTag:-tag];
            CGRect frame = CGRectFromString([itemFrameDict objectForKey:[NSString stringWithFormat:@"%i",[[sender view] tag]]]);

            CGAffineTransform transform = temp.transform;
            [[sender view] setTransform:transform];
            [[sender view] setFrame:frame];
            [tempScroll addSubview:[sender view]];
        }
    }
}

【问题讨论】:

  • 请展示你在平移手势的实现中做了什么。
  • 同样在使用 IB 时,默认情况下,UIImageView 未启用用户交互。对于 imageview 上的手势识别器,您必须启用它。
  • @zen 我已经添加了我正在使用的代码

标签: xcode uiscrollview uiimageview scroll uipangesturerecognizer


【解决方案1】:

我不确定我是否完全理解您通过在 UIImageView 上使用 UIPanGestureRecognizer 来实现的目标,而 UIImageView 已经在 UIScrollView 中。但是根据您的描述,听起来您希望UIScrollView 做这件事,而UIPanGestureRecognizer 不阻止它。我相信你需要为你的UIPanGestureRecognizer 实现这个委托方法:

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}

请阅读UIGestureRecognizerDelegate Protocol reference,了解允许同时进行手势识别。根据文档:

默认实现返回 NO——不能有两个手势 同时识别。

/* 编辑 */

来自UIPanGestureRecognizer - Only vertical or horizontal: 只为UIPanGestureRecognizer 实现一个方向。这是垂直平移:

- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)panGestureRecognizer {
    CGPoint translation = [panGestureRecognizer translationInView:someView];
    return fabs(translation.y) > fabs(translation.x);
}

【讨论】:

  • 其实我在这里实现拖放功能
  • 我已经实现了这个 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES; }
  • @Khushboo 所以你想在 UIScrollView 内移动 UIImageView? UIScrollView 是只能垂直/水平滚动,还是两者兼而有之?
  • @Khushboo 您是否正确设置了 UIScrollView 的 contentSize?如果您不添加 panRecognizer,滚动是否按照您希望的方式工作?您能否提供更多设置的上下文,鉴于对 i 的引用,您似乎处于 for 循环中。
  • 这可能会有所帮助:stackoverflow.com/questions/7100884/…
猜你喜欢
  • 2013-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多