「didSelectItemAtIndexPath...」メソッドを実装する UICollection ビューがあります。セルを選択(タップ)すると、別のView Controllerに遷移します。ただし、各セルには垂直スクロール ビューも含まれます。ユーザーが各セルを操作して、縦にスワイプしてスクロール ビューの内容を表示するか、1 回タップしてセルを選択するかを選択できるようにしたいと思います。
私が最初に考えたのは、スワイプ用とタップ用の 2 つのジェスチャ認識機能をセルに追加することでした。また、スワイプ ジェスチャをスクロール ビューのスクロール アクションに結び付ける方法もわかりません。
このリソースを見つけました: http://uncorkedstudios.com/2013/05/03/using-uigesturerecognizers-with-uicollectionviews/、requireGestureRecognizerToFail の使用を示唆しています。
上記の両方のアプローチをハックした後、これを行う方法、さらに重要なことに、適切に行う方法を理解することに近づいているとは感じません. 各 UICollectionViewCell を別々のアクションで 2 つの固有のジェスチャに応答させるための推奨される戦略を提案できる人はいますか?
編集 この問題を解決するために次のアプローチを試しましたが、2つのジェスチャ認識機能を連携させることはできません:
1) コレクション ビュー セル (UICollectionViewCell のサブクラス) に、init メソッドで設定した UITapGestureRecognizer プロパティを追加しました。
self.tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(cellWasTapped:)];
self.tap.delegate = self; //this class is a UIGestureRecognizerDelegate
2) cellWasTapped メソッド
- (void)cellWasTapped:(UITapGestureRecognizer *)sender
{
NSLog(@"this cell was tapped!"); //temporary
}
3) スクロール ビューは webView スクロール ビューであるため、webView デリゲート メソッドの最後にジェスチャ認識コードを追加しました。
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
[self.overlayView removeFromSuperview];
CGSize contentSize = self.webView.scrollView.contentSize;
CGSize viewSize = self.webView.bounds.size;
float rw = viewSize.width / contentSize.width;
self.webView.scrollView.minimumZoomScale = rw;
self.webView.scrollView.maximumZoomScale = rw;
self.webView.scrollView.zoomScale = rw;
self.webView.scrollView.scrollEnabled = YES;
self.webView.scrollView.contentOffset = CGPointMake(0, 0);
self.webView.scrollView.size = CGSizeMake(self.webView.scrollView.contentSize.width,
self.webView.scrollView.contentSize.height - 5);
self.webView.scrollView.delegate = self;
[self addGestureRecognizer:self.tap];
[self.tap requireGestureRecognizerToFail:self.webView.scrollView.panGestureRecognizer];
}
問題は、タップ ジェスチャ認識機能が webView のコンテンツが Web ビューに表示される前にしか機能しないことです。コンテンツが表示された後は、Web ビューのスクロールのみが機能します。