Я подправил образец Touches. Не уверен, что это правильный путь.
Все это делается в контроллере вида с обоими видами (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;
}
}
Я не полностью ПРОВЕРИЛ весь код. Попробуйте и убедитесь, что это работает.