关于 Collectionview 场景的建议

Posted

技术标签:

【中文标题】关于 Collectionview 场景的建议【英文标题】:Advice on Collectionview scenario 【发布时间】:2015-01-17 14:07:00 【问题描述】:

需要一些关于如何使用 Collectionview 处理场景的建议。简而言之,该应用程序有一个显示图像的 CV,您可以在其中点击带有图像缩略图的单元格,然后它将显示该图像的全屏视图。我通过在 didSelectItemAtIndexPath 中实例化一个新的 UIView(不是来自情节提要)来实现这一点。因此,来自单元格的图像的全屏视图只是通过点击单元格触发的新 UIView,我将视图的图像设置为与单元格的图像相同......足够简单。全屏视图还有一个与每个图像相关的按钮。点击全屏图像会关闭图像并返回到 CV。所有这些都完美无缺。

但是,我刚刚意识到我还希望能够在全屏模式下滑动浏览所有图像......基本上与 ios 相册的工作方式非常相似。通过向 didSelectItemAtIndexPath 添加滑动手势并将动作选择器设置为处理滑动的方法,我能够非常快速地编写一些代码来执行此操作,这很有效。但是,这样做的结果实际上只是更改了选择(点击)的原始单元格的图像。因此,在全屏模式下滑动图像时,我无法跟踪所选单元格。

所以我需要有关如何处理此问题的建议。我知道必须有这样的例子,但我找不到任何例子。有人对我应该如何实施这个有任何建议吗?谢谢!

来自 didSelectItemAtIndexPath 的代码...

self.fullScreenImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width-10, self.view.bounds.size.height-15)];
self.fullScreenImage.contentMode = UIViewContentModeScaleAspectFit;

UISwipeGestureRecognizer *rightSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleRightSwipe:)];
[rightSwipe setDirection:UISwipeGestureRecognizerDirectionRight];
[self.fullScreenImage addGestureRecognizer:rightSwipe];

UISwipeGestureRecognizer *leftSwipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(handleLeftSwipe:)];
[leftSwipe setDirection:UISwipeGestureRecognizerDirectionLeft];
[self.fullScreenImage addGestureRecognizer:leftSwipe];

if (!self.isFullScreen) 
    self.fullScreenImage.transform = CGAffineTransformMakeScale(0.1, 0.1);
    __weak BaseViewController *weakSelf = self;
    [UIView animateWithDuration:0.5 delay:0 options:0 animations:^
        NSLog(@"Starting animiation!");
        weakSelf.view.backgroundColor = [UIColor blackColor];
        weakSelf.myCollectionView.backgroundColor = [UIColor blackColor];
        weakSelf.fullScreenImage.center = self.view.center;
        weakSelf.fullScreenImage.backgroundColor = [UIColor blackColor];
        weakSelf.fullScreenImage.image = [UIImage imageWithContentsOfFile:coffeeImageData.imageURL.path];
        weakSelf.fullScreenImage.transform = CGAffineTransformIdentity; // zoom in effect
        [weakSelf.view addSubview:self.fullScreenImage];
        [weakSelf.fullScreenImage addSubview:likeButton]; // add the button to the view
    completion:^(BOOL finished)
        if (finished) 
            NSLog(@"Animation finished!");
            weakSelf.isFullScreen = YES;
        
    ];
    return;

处理来自...的滑动手势 - (void)handleLeftSwipe:(UISwipeGestureRecognizer *)sender

// make sure indexForSwiping is not > than size of array
if (self.indexForSwiping != [self.imageLoadManager.coffeeImageDataArray count]-1) 
    self.indexForSwiping += 1;
    NSString *cacheKey = self.allCacheKeys[self.indexForSwiping];

    if (cacheKey) 
        [self.imageCache queryDiskCacheForKey:cacheKey done:^(UIImage *image, SDImageCacheType cacheType) 
            if (image) 
                [UIView animateWithDuration:1.0 delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^
                    self.fullScreenImage.image = image;
                 completion:^(BOOL finished) 
                    NSLog(@"swiping");
                ];
            
        ];
    

【问题讨论】:

【参考方案1】:

这个框架已经有了这样的功能,所以你可以查看源代码来了解它是如何工作的......

https://github.com/mwaterfall/MWPhotoBrowser

【讨论】:

谢谢,我去看看!【参考方案2】:

我希望视图成为 viewController 的一部分,而不仅仅是你的功能的一部分。然后,让 viewController 管理图像的滑动、图像和位置。当你的 collectionView 被点击时,在你的 viewController 中设置位置,这样当你捕捉到滑动时,你可以增加一并用新图像更新你的视图。如果还不够清楚,请告诉我,我可以尝试澄清

【讨论】:

我不确定我是否在关注你。您是说通过情节提要在 VC 中存在显示全屏图像的 UIView 吗?如果是这样,我不确定在这种情况下我会如何做到这一点。目前,它在视图控制器中,但在 didSelectItem 方法中以编程方式实例化。 你能展示你在哪里实例化它的代码以及你是如何处理滑动的吗?如果我确切地看到你是如何做到的,我想我可以更好地澄清。 感谢您的帮助...刚刚编辑了原始帖子以显示来自 didSelectItemAtIndexPath 的一些代码以及处理左滑动手势的方法。向右滑动是一样的,只是用不同的索引来访问数组中的数据。 你正在做我想让你做的事情。如果正在修改 collectionView,我会看看您是否可以创建图像的副本并将其设置为您的 imageView 正在使用的图像,似乎可能存在指针问题导致它同时更新两个位置。 谢谢,我会继续调查的。

以上是关于关于 Collectionview 场景的建议的主要内容,如果未能解决你的问题,请参考以下文章

关于机器学习场景中用户分类的建议

缓存关于缓存的一些使用场景及建议

Collectionview 的底部约束未在运行时更新

Github上关于iOS的各种开源项目集合(强烈建议大家收藏,查看,总有一款你需要)

CollectionView 不同的单元格选择

关于collectionview中的cellfor 代理方法没调用问题