24

我正在尝试在 a 中添加UIScrollView一个UICollectionViewCell. 这个想法是您可以使用捏来缩放UIScrollView(以及其中的图像),但滚动视图似乎不处理任何手势。我猜他们被UICollectionView..

我已将 的委托设置为UIScrollViewUICollectionViewCell但没有调用任何委托方法。

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

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
     }
}

无需在父 collectionview 控制器上添加或删除手势识别器,就像一个魅力!

感谢您之前的示例!

于 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;
}

来自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];
}

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

编辑

panGestureRecognizer根据 OP 的建议,我将其添加到上述示例中。缩放本身完全由 处理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

检查所有相关视图的多点触控是否打开。默认情况下,iOS 在大多数视图上禁用多点触控以节省能源。

于 2013-06-06T11:15:45.890 回答
0

代表没有被调用,因为您在 UICollectionview 中添加了它。触摸事件可用于作为超级视图的集合视图,因此无法由内部视图获得。您可能必须考虑其他一些方法来实现此模型。

UICollectionView具有相同的模式,问题出现在滚动视图内的表视图中,滚动视图[这是UITableView超级视图]接受触摸事件并在这种情况下使表视图可滚动,滚动视图的滚动必须被禁用。这是另一个该问题的版本

苹果文档说上述情况会产生不可预测的结果。所以这可能与您的问题相同。

在我看来,您必须寻求更好的设计,才能实现您的目标

于 2013-06-10T11:43:36.720 回答
0
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{            
  if (touch.view == [self myScrollView]) //<- whatever your scrollView is called 
    {
      return YES;
    }
  return NO;
}

不知道您的代码,但尝试使用上面的代码,看看您是否可以过滤您想要的对象的触摸。上面的代码来自UIGestureRecognizerDelegate 协议参考

于 2013-06-08T13:40:02.227 回答
0
I've set the delegate of the UIScrollView to be the UICollectionViewCell, but none of the delegate methods are being called.

为此,只需在 collectionViewCell 中定义一个函数

  @IBOutlet weak var mainScrollView:UIScrollView!
  func setup(){
        mainScrollView.minimumZoomScale=1
        mainScrollView.maximumZoomScale=10.0

        mainScrollView.delegate=self

    }

   func viewForZooming(in scrollView: UIScrollView) -> UIView? {
        return yourimageviewinside of scrollview
    }

collectionview(_,cellForItem )在collectionview的方法中调用这个函数

于 2017-01-17T07:01:09.640 回答