UIView通过某些事件进行查看

UIView通过某些事件进行查看,uiview,uigesturerecognizer,Uiview,Uigesturerecognizer,我在另一个UIView的顶部有一个UIView,我希望顶部的UIView只在1、2和3次点击时响应UIAPTgestureRecognitor,但任何其他事件都会传递到它下面的UIView。下面的视图有一个UIPinchGestureRecognizer和一个UIPanGestureRecognizer,但如果任何触摸都在顶部UIView上,则该视图将不起作用。如果我将top-UIView设置为userInteractionEnabled为NO,它就可以正常工作,但是我当然无法从top-UIVi

我在另一个UIView的顶部有一个UIView,我希望顶部的UIView只在1、2和3次点击时响应UIAPTgestureRecognitor,但任何其他事件都会传递到它下面的UIView。下面的视图有一个UIPinchGestureRecognizer和一个UIPanGestureRecognizer,但如果任何触摸都在顶部UIView上,则该视图将不起作用。如果我将top-UIView设置为userInteractionEnabled为NO,它就可以正常工作,但是我当然无法从top-UIView获得点击。非常感谢您提供的任何提示。

我对Touchs示例进行了调整。不确定这是否是正确的方法

所有这些都是在视图控制器中通过两个视图(topView和bottomView)完成的

在viewDidLoad中,我将所有手势识别器添加到俯视图-

    tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureCaught)];
    [tapGesture setDelegate:self];
    [topView addGestureRecognizer:tapGesture];
    [tapGesture release];

    panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panBottomView)];
    [panGestureRecognizer setMaximumNumberOfTouches:2];
    [panGestureRecognizer setDelegate:self];
    [topView addGestureRecognizer:panGestureRecognizer];
    [panGestureRecognizer release];


    pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scaleBottomView)];
    [pinchGesture setDelegate:self];
    [topView addGestureRecognizer:pinchGesture];
    [pinchGesture release];
手势动作

    - (void)panBottomView
    {
        UIView *piece = bottomView; //Hardcoded because the pan gesture to be applied only on the bottom view.

        [self adjustAnchorPointForGestureRecognizer:panGestureRecognizer];

        if ([panGestureRecognizer state] == UIGestureRecognizerStateBegan || [panGestureRecognizer state] == UIGestureRecognizerStateChanged) {
            CGPoint translation = [panGestureRecognizer translationInView:[piece superview]];

            [piece setCenter:CGPointMake([piece center].x + translation.x, [piece center].y + translation.y)];
            [panGestureRecognizer setTranslation:CGPointZero inView:[piece superview]];
        }
    }


    // scale the piece by the current scale
    // reset the gesture recognizer's rotation to 0 after applying so the next callback is a delta from the current scale
    - (void)scaleBottomView {


        [self adjustAnchorPointForGestureRecognizer:pinchGesture];

        if ([pinchGesture state] == UIGestureRecognizerStateBegan || [pinchGesture state] == UIGestureRecognizerStateChanged) {
            bottomView.transform = CGAffineTransformScale([bottomView transform], [pinchGesture scale], [pinchGesture scale]);
            [pinchGesture setScale:1];
        }
    }

    - (void) tapGestureCaught {

//Do stuff for the topView

    }

    // scale and rotation transforms are applied relative to the layer's anchor point
    // this method moves a gesture recognizer's view's anchor point between the user's fingers
    - (void)adjustAnchorPointForGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer {
        if (gestureRecognizer.state == UIGestureRecognizerStateBegan) {

            /*You can put if conditions based on the class of gestureRecognizer for furthur customization. For me this method was not called for any gesture on the TOPVIEW. So i have sort of harcoded the following line*/
            UIView *piece = bottomView;
            CGPoint locationInView = [gestureRecognizer locationInView:piece];
            CGPoint locationInSuperview = [gestureRecognizer locationInView:piece.superview];

            piece.layer.anchorPoint = CGPointMake(locationInView.x / piece.bounds.size.width, locationInView.y / piece.bounds.size.height);
            piece.center = locationInSuperview;
        }
    }
我还没有完全测试所有的代码。试一试,看看效果如何