我想我解决了。感觉这个解决方案不是最好的或最好的,但它确实有效。
我做了什么:
我创建了一个新的UIPanGestureRecognizer 并将其添加到imageScrollView。此手势识别器具有最小值。和最大。触及 2。在此识别器的操作方法中,我启用和禁用了 imageScrollView 的滚动。
我还创建了一个自己的UIScrollView 子类并实现了gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer 以返回YES。
在代码中:
MenuViewController:我在 pageVC 中的第一个 UIViewController。该类什么都不做(出于此问题的目的)。这只是一个占位符,可以用两根手指滑动并显示一些内容。
RootViewController:
self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
//... exactly the same code as in the Apple template
//the UIPageViewController should only use 2 finger:
for (UIView* view in [self.pageViewController.view subviews]) {
if ([view isKindOfClass:[UIScrollView class]]) {
UIScrollView* scrollView = (UIScrollView*)view;
scrollView.panGestureRecognizer.minimumNumberOfTouches = 2;
scrollView.panGestureRecognizer.maximumNumberOfTouches = 2;
}
}
ImageScrollViewController:
//self.scrollView is from type 'CustomScrollView'
-(void)viewDidLoad {
[super viewDidLoad];
// autolayout would be nicer, but this was faster and easier for me
self.scrollView.contentSize = CGSizeMake(self.view.frame.size.width * _pageImages.count, self.scrollView.frame.size.height);
//... a for loop to add all UIImageViews as a subView to self.scrollView
UIPanGestureRecognizer *twoFingerPan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePan:)];
twoFingerPan.minimumNumberOfTouches = 2;
twoFingerPan.maximumNumberOfTouches = 2;
[self.scrollView addGestureRecognizer:twoFingerPan];
twoFingerPan.delegate = (CarScrollView*)self.scrollView;
}
//the inner scrollView for the images should not scroll when two fingers are active
- (void)handlePan:(UIPanGestureRecognizer*)recognizer {
switch (recognizer.state) {
case UIGestureRecognizerStateBegan:
case UIGestureRecognizerStatePossible:
self.scrollView.scrollEnabled = NO;
break;
case UIGestureRecognizerStateCancelled:
case UIGestureRecognizerStateEnded:
case UIGestureRecognizerStateFailed:
self.scrollView.scrollEnabled = YES;
default:
break;
}
}
CustomScrollView:我用图片为 UIScrollView 创建了一个子类。
@interface CarScrollView : UIScrollView <UIGestureRecognizerDelegate>
@implementation CarScrollView
//Method has to return YES so that a two finger pan gesture will be used for the outer scrollView/pageViewController
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
return YES;
}