24

UIScrollViewの中に aを追加しようとしていUICollectionViewCellます。アイデアは、ピンチを使用してUIScrollView(およびそれを使用して画像を)ズームできるということですが、スクロールビューはジェスチャを処理していないようです。私は彼らがに捕らえられていると推測していUICollectionViewます。

のデリゲートを に設定しましたUIScrollViewUICollectionViewCell、どのデリゲート メソッドも呼び出されていません。

編集: コードを使用して github リポジトリを作成しました (できるだけ単純化しました)。ほんの数行のコードですが、何が間違っていたのかわかりません。

EDIT2:答えが見つかった後、上記のレポに修正を追加しました。他の人にも役立つことを願っています:)

https://github.com/krummler/gallery-pinchzoom-example

4

7 に答える 7

26

iOS 9.3+でSWIFT 3の実装を作成したところ、次のことだけを行いました。

1.スクロールビュー内に画像ビューを配置します

ストーリーボードの例

2. scrollview デリゲートを collectionview セル クラスに接続する

3. collectionview サブクラスに以下のコードを実装します。

class FullScreenImageTextDetailCollectionViewCell: UICollectionViewCell, UIScrollViewDelegate {

     @IBOutlet var scrollview: UIScrollView!
     @IBOutlet weak var backgroundImageView: UIImageView!

     override func awakeFromNib() {
         self.scrollview.minimumZoomScale = 0.5
         self.scrollview.maximumZoomScale = 3.5
         self.scrollview.delegate = self
     }

     func viewForZooming(in scrollView: UIScrollView) -> UIView? {
         return self.backgroundImageView
     }
}

親コレクションのView Controllerに追加または削除するGesture Recognizerは必要なく、魅力的に機能しました!

これに到達するための以前の例に感謝します!

于 2016-12-22T18:15:09.417 に答える
25

そのためには、UIGestureRecognizers を操作してみてください。でGalleryViewController

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView 
                  cellForItemAtIndexPath:(NSIndexPath *)indexPath {

    GalleryImageCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"galleryImageCell" forIndexPath:indexPath];

    ImageContext *imageContext = [self.images objectAtIndex:indexPath.row];

    cell.imageContext = imageContext;
    [self.collectionView addGestureRecognizer:cell.scrollView.pinchGestureRecognizer];
    [self.collectionView addGestureRecognizer:cell.scrollView.panGestureRecognizer];

    return cell;
}

UIView に関する Apple のドキュメントから:

ジェスチャ レコグナイザーをビューにアタッチすると、表示されるジェスチャの範囲が定義され、そのビューとそのすべてのサブビューに対してヒット テストされたタッチを受け取るようになります。ビューはジェスチャ レコグナイザーを保持します。

そのため、セルが表示されなくなったら、必ずそれらを削除する必要があります。

- (void)collectionView:(UICollectionView *)collectionView 
  didEndDisplayingCell:(UICollectionViewCell *)cell 
    forItemAtIndexPath:(NSIndexPath *)indexPath {

    // Get the cell instance and ...
    [self.collectionView removeGestureRecognizer:cell.scrollView.pinchGestureRecognizer];
    [self.collectionView removeGestureRecognizer:cell.scrollView.panGestureRecognizer];
}

UIGestureRecognizer のデリゲートを変更しているのではなく、スコープのみを変更しているため、そのセルのスクロールビューのみのズームを制御します。

編集

panGestureRecognizerOPから必要であるという提案に従って、上記の例にを追加しました。ズーム自体は によって完全に処理されpinchGestureRecognizerますが、ほとんどの場合、イメージをそのサブセットのみが表示されるポイントにズームした後、表示されている部分を移動するためにパンする必要があるのは事実です。つまり、適切なズーム エクスペリエンスの一部です。

于 2013-06-10T14:55:56.093 に答える
4

セルにスクロールビューを追加し、現在のセル画像ビューをスクロールビューに追加してください。次に、以下のコードを使用します。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    ImageContext *context = [self.images objectAtIndex:indexPath.row];
    ImageCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"imageCell" forIndexPath:indexPath];
    cell.cellScrollView.autoresizesSubviews = YES;
    cell.cellScrollView.multipleTouchEnabled =YES;
    cell.cellScrollView.maximumZoomScale = 4.0;
    cell.cellScrollView.minimumZoomScale = 1.0;
    cell.cellScrollView.clipsToBounds = YES;
    cell.cellScrollView.delegate = self;
    cell.cellScrollView.zoomScale = 1.0;

    [cell.imageView setImage:[UIImage imageNamed:context.thumbImageUrl]];

return cell;
}
 -(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
 {   NSLog(@"%i",scrollView.subviews.count);
  for (UIView *v in scrollView.subviews) {
    if ([v isKindOfClass:[UIImageView class]]) {
        return v;
      }
  }

}

于 2013-06-10T14:20:52.917 に答える
0

UICollectionview 内に追加したため、デリゲートは呼び出されません。タッチ イベントは、スーパービューであるコレクション ビューで使用できるため、内部のビューでは取得できません。このモデルを実現するには、他の方法を考える必要があるかもしれません。

UICollectionViewと同じパターンを持っていますUITableView,スクロールビュー内のテーブルビューで問題が発生します,タッチイベントが[スーパービューである]スクロールビューで受け入れられ、その場合テーブルビューをスクロール可能にするには,スクロールビューのスクロールを無効にする必要があります.これは別の方法ですその問題のバージョン

アップルのドキュメントによると、上記のケースでは予測できない結果が生じるとのことです。したがって、これは問題と同じである可能性があります。

私の意見では、あなたが探しているものを達成できるより良いデザインを求めなければなりません

于 2013-06-10T11:43:36.720 に答える
0

関連するすべてのビューのマルチタッチがオンになっているかどうかを確認します。iOS では、エネルギーを節約するために、ほとんどのビューでデフォルトでマルチタッチが無効になっています。

于 2013-06-06T11:15:45.890 に答える