一般
解決策を探し回った結果、そのほとんどは UIScrollveiw を継承して
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
if (gestureRecognizer.state != UIGestureRecognizerStatePossible) {
return YES;
} else {
return NO;
}
}
メソッドが YES を返すことで、ジェスチャがスクロールビューとテーブルビューの両方で認識されるようになります。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
メッセージ転送メカニズムを使用して、サブクラスの他のメソッドを元のスクロールビューに転送します。ただし、このメソッドはAPPLEによってオーバーライドされ、scrollview.panGestureRecognizer.delegateを変更することはできません。
最終的な解決策
最終的な解決策は、テーブルビューにジェスチャ認識機能を追加することです。
- 最初にUIPageViewControllerの scrollview
UIScrollView *scrollView = nil;
for (UIView *view in self.view.subviews) {
if ([view isKindOfClass:[UIScrollView class]]) {
scrollView = (UIScrollView *)view;
break;
}
}
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:nil];
panGesture.delaysTouchesBegan = YES;
panGesture.cancelsTouchesInView = NO;
panGesture.delegate = self;
[self.tableView addGestureRecognizer:panGesture];
self.scrollView.canCancelContentTouches = YES;
[self.scrollView.panGestureRecognizer requireGestureRecognizerToFail:panGesture];
- のメソッドを使用します。
このメソッドは、ジェスチャー認識器が可能な状態から別の状態に遷移するときに呼び出されます。
このメソッドはNOを返し、ジェスチャー認識器はジェスチャーが認識されなくなる失敗状態になります。
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
if (![gestureRecognizer isMemberOfClass:[UIPanGestureRecognizer class]]) {
return NO;
}
UIPanGestureRecognizer *panGesture = (UIPanGestureRecognizer *)gestureRecognizer;
CGPoint translation = [panGesture translationInView:self.tableView];
return translation.x < 0;
}
YES を返すと、テーブルビューとスクロールビューの両方でジェスチャを認識できます。
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
return otherGestureRecognizer.view == self.tableView;
}