如何在UICollectionViewCell内缩放UIScrollView?

Kev*_*n R 23 objective-c uikit ios

我正在尝试添加一个UIScrollView内部UICollectionViewCell.这个想法是你可以使用捏缩放UIScrollView(和它,它内部的图像),但滚动视图似乎不处理任何手势.我猜他们被这个人抓住了UICollectionView.

我给自己定的委托UIScrollViewUICollectionViewCell,但没有委托方法被调用.

编辑:我用代码制作了一个github repo(尽可能简化).虽然它只是几行代码,但我看不出我做错了什么.

编辑2:找到答案后,我添加了修复上述回购,希望其他人发现它也有帮助:)

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

mat*_*hat 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;
}
Run Code Online (Sandbox Code Playgroud)

来自Apple关于UIView的文档:

将手势识别器附加到视图定义了所表示的手势的范围,使其接收对该视图及其所有子视图进行经过测试的触摸.视图保留手势识别器.

因此,您还需要确保在单元格不再显示时将其删除.

- (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];
}
Run Code Online (Sandbox Code Playgroud)

由于您没有修改UIGestureRecognizer的委托,只修改其范围,因此它仍将控制该单元格的滚动视图的缩放.

编辑:

panGestureRecognizer根据OP的建议添加了上面的例子,说明需要它.缩放本身完全由处理pinchGestureRecognizer,但在大多数情况下,在将图像缩放到只有一部分可见的点之后,您需要平移以移动可见部分.也就是说,它是适当缩放体验的一部分.


mou*_*igo 24

我刚刚在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
     }
}
Run Code Online (Sandbox Code Playgroud)

在父集合视图控制器上添加或删除手势识别器是不必要的,就像一个魅力!

感谢前面的例子!