2

パンジェスチャの機能をイメージビューに実装したいのですが、このイメージビューはスクロールビューのサブビューです。問題は、スクロールビューをスクロールしようとすると、イメージビューのパンジェスチャが認識され、スクロールビューがスクロールしないことです。これで私を助けてください。

これは、パンを 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];

イメージビューのユーザーは「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]];
        }
    }
}
4

1 に答える 1

3

すでに にあるUIPanGestureRecognizeraを使用して、あなたが何を達成しようとしているのか正確に理解しているかどうかはわかりません。しかし、あなたの説明から、あなたはそれをやりたいと思っていて、それをブロックしないように思えます。あなたのためにこのデリゲートメソッドを実装する必要があると思います:UIImageViewUIScrollViewUIScrollViewUIPanGestureRecognizerUIPanGestureRecognizer

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

同時ジェスチャー認識の許可に関しては、 UIGestureRecognizerDelegate プロトコルのリファレンスをお読みください。ドキュメントによると:

デフォルトの実装は NO を返します。2 つのジェスチャを同時に認識できません。

/* 編集 */

UIPanGestureRecognizer から - 垂直または水平のみ:の 1 つの方向のみを実装しUIPanGestureRecognizerます。これは垂直パンの場合です。

- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)panGestureRecognizer {
    CGPoint translation = [panGestureRecognizer translationInView:someView];
    return fabs(translation.y) > fabs(translation.x);
}
于 2013-04-12T06:36:36.697 に答える