UICcrollView在UICollectionViewCell内滚动区域

时间:2014-04-15 06:18:36

标签: objective-c ios7 uiscrollview uicollectionview

我有以下UICollectionView控制器

enter image description here

我的问题是,当我放大图像时,我能够“滚动”图像边界。它几乎与这个问题Keep zoomable image in center of UIScrollView完全相似,但答案并没有为我解决。

据我所知,我认为这是因为scrollView的内容大小未设置为图像的大小。但是,我不确定在我的子类UICollectionViewCell中设置类似self.scrollView.contentSize = self.imageView.image.size的位置。

默认视图

enter image description here

放大并超越图像边界

enter image description here

我预期的行为是,如果用户尝试滚动图像,图像可以退回。

到目前为止的相关代码

Imgur Cell Subclass

- (void)awakeFromNib {
    self.scrollView.minimumZoomScale = 1;
    self.scrollView.maximumZoomScale = 3.0;
    self.scrollView.delegate = self;
}

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return self.imageView;
}

查看控制器

- (void)viewDidLoad {
    [super viewDidLoad];
    [self setStyle];
    ImgurCellDetail *cell = (ImgurCellDetail *)[self.collectionView cellForItemAtIndexPath:self.indexPath];
    cell.scrollView.minimumZoomScale = cell.scrollView.frame.size.width / cell.imageView.frame.size.width;
    cell.scrollView.maximumZoomScale = 3.0;
    cell.scrollView.contentSize = cell.imageView.image.size;
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self loadSelectedImage];
}

- (void)loadSelectedImage
{
    [self.collectionView scrollToItemAtIndexPath:self.indexPath
                                atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally
                                        animated:NO];

}

- (ImgurCellDetail *)collectionView:(UICollectionView *)collectionView
                  cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"Cell";
    ImgurCellDetail *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
    [self resetImage:cell];
    cell.imageView.image = [UIImage imageWithContentsOfFile:self.imageArray[indexPath.row]];
    [self.collectionView addGestureRecognizer:cell.scrollView.pinchGestureRecognizer];
    [self.collectionView addGestureRecognizer:cell.scrollView.panGestureRecognizer];
    return cell;
}

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout
 sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    // Need this for 3.5"
    return self.collectionView.frame.size;
}

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

    [self.collectionView removeGestureRecognizer:cell.scrollView.pinchGestureRecognizer];
    [self.collectionView removeGestureRecognizer:cell.scrollView.panGestureRecognizer];
}

- (void)resetImage:(ImgurCellDetail *)cell {
    //reset zoomScale back to 1 so that contentSize can be modified correctly
    cell.scrollView.zoomScale = 1;
}

我应该提一下,当图像视图设置为纵横填充时我没有问题,但正如您所看到的,它当前设置为纵横比这是哪里我的烦恼开始了。

2 个答案:

答案 0 :(得分:1)

我认为你必须首先设置滚动视图的contentSize以匹配图像缩小尺寸的大小(第一个屏幕截图中显示的大小),而不是实际的大小。图片。

// Not this
//cell.scrollView.contentSize = cell.imageView.image.size;

// But this
CGSize originalSize = cell.imageView.image.size;
CGSize sizeToFit = cell.scrollView.bounds.size;
CGFloat scaleDownFactor = MIN(sizeToFit.width / originalSize.width,
                              sizeToFit.height / originalSize.height);
CGSize scaledDownSize = CGSizeMake(nearbyintf(originalSize.width * scaleDownFactor),
                                   nearbyintf(originalSize.height * scaleDownFactor));
cell.scrollView.contentSize = scaledDownSize;

// Also use scaledDownSize for the viewForZooming

从那里开始调整内容插入内容,就像你链接的答案一样。

最后,viewDidLoad可能无法完全调整滚动视图的实际尺寸!

答案 1 :(得分:0)

我设法解决了自己的错误。我将此处找到的方法调整为:http://www.raywenderlich.com/10518/how-to-use-uiscrollview-to-scroll-and-zoom-content到我的解决方案中。

我必须做出的改变是:

  • 以编程方式生成图像,而不是使用故事板
  • 在我的ukeollectionView子类的awakeInNib方法中添加scrollview最小/最大缩放初始化代码
  • cellForRowIndexPath
  • 中生成图片

我认为这是关于它的。