UIView goes through certain events

I have a UIView on top of another UIView, and I would like the top answer to only respond to UITapGestureRecognizer on 1, 2, and 3 branches, but any other event would be passed, although in the UIView below. The view below has UIPinchGestureRecognizer and UIPanGestureRecognizer, but will not work if any of the touches are on the top UIView. It works correctly if I set the top UIView for userInteractionEnabled to NO, but then of course I cannot get taps from the top UIView. Any advice is appreciated.

+4
source share
1 answer

I set up using the Touch sample. Not sure if this is the right way.

All this is done in the view controller with both views (topView and bottomView).

in viewDidLoad I add all gesture recognizers to the top view -

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]; 

Gesture actions

  - (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 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 anchor point // this method moves a gesture recognizer view anchor point between the user 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; } } 

I have not fully tested all the code. Try it and see how it works.

0
source

Source: https://habr.com/ru/post/1338299/


All Articles