blog

UIPageViewControllerとUITableViewCellの左スライド削除ジェスチャ間の競合を解決する。

あるプロジェクトで、2 つのテーブルビューを水平にネストする必要があり、右側のテーブルビューで左スワイプによるセルの削除をサポートする必要がありました。 UI をレイアウトした後、セルを削除するための...

Feb 23, 2020 · 2 min. read
シェア

UIレイアウトの後、セルを削除するための左スワイプがトリガーされず、ジェスチャー認識がスクロールビューによってブロックされているため、クイックスワイプでしか編集モードに入れないことがわかります。

一般

解決策を探し回った結果、そのほとんどは 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を変更することはできません。

最終的な解決策

最終的な解決策は、テーブルビューにジェスチャ認識機能を追加することです。

  1. 最初に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];
  1. のメソッドを使用します。

このメソッドは、ジェスチャー認識器が可能な状態から別の状態に遷移するときに呼び出されます。

このメソッドは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;
}
Read next

半日かけてソースコードを拾い集め、ようやくOauth2カスタム処理結果の最適解を見つけた!

マイクロサービス許可究極解、Spring Cloud Gateway + Oauth2で実現する統一認証・認証方式」では、「マイクロサービス許可究極解、Spring Cloud Gateway + Oauth2で実現する統一認証・認証方式」を紹介しました!ではマイクロサービスでのOauth2利用が紹介されましたが、Oauth2のデフォルト処理結果がカスタムされていません。Oauth2での認証・認可は、ログを取るなど指定した形式で結果を返してほしいと切に願うことがあります...。

Feb 23, 2020 · 9 min read