从 UICollectionViewCell 到 UIScrollView 中的正确位置

Posted

技术标签:

【中文标题】从 UICollectionViewCell 到 UIScrollView 中的正确位置【英文标题】:Segue from UICollectionViewCell to right place in a UIScrollView 【发布时间】:2013-04-20 18:55:38 【问题描述】:

我的UIScrollView 中有一些图像,我希望如果我点击它们,就会有一个UIScrollView,我可以在其中滚动浏览我的所有图像(就像在照片的应用程序中一样)。我得到了这个代码:

CollectionViewController:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
    //ImageDetailSegue
    if ([segue.identifier isEqualToString:@"ScrollView"]) 
        Cell *cell = (Cell *)sender;
        NSIndexPath *indexPath = [self.collectionView indexPathForCell:cell];

        int imageNumber = indexPath.row % 9;

        ScrollViewController *divc = (ScrollViewController *)[segue destinationViewController];
        divc.img = [UIImage imageNamed:[NSString stringWithFormat:@"full%d.png", imageNumber]];
    

滚动视图控制器:

for (int i = 1; i < 4; i++) 
    UIImageView *image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"full%d.png", i]]];

    image.frame = CGRectMake((i - 1) * 320, 0, 320, 240);
    [imageScroller addSubview:image];

imageScroller.contentSize = CGSizeMake(320 * 6, 240);

如何连接这两者?

【问题讨论】:

你是什么意思,“我怎样才能把两者联系起来”?你看到了什么,你想要什么? segue 没有把你带到 ScrollViewController 吗? 我不知道collectionviewcontroller 中的图像如何出现在我的scrollviewcontroller 中 【参考方案1】:

如果您的收藏视图有 50 张图片,并且您点击了 #5,您是说要查看一个滚动视图,其中包含相同的 50 张图片,但从图片 #5 开始?

基本上,这完全取决于模型支持您的UICollectionView 控制器的功能。例如,假设集合视图有一个数组(可能是图像名称数组,也可能是图像文件名是其中一个属性的对象数组),如下所示:

@property (nonatomic, strong) NSMutableArray *objects;

那么第二个场景可能有一个属性反映了这一点,例如:

@property (nonatomic, weak) NSArray *objects;

第一个属性将是对支持其集合视图的主视图控制器数组的不可变引用。

你的滚动视图也应该有一些索引属性,所以你可以告诉它你选择了哪个单元格:

@property (nonatomic) NSInteger index;

第二个视图控制器可以使用这个index 属性来确定从哪里开始它的contentOffset

然后第一个控制器的 prepareForSegue 看起来很像您建议的:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    if ([segue.identifier isEqualToString:@"ScrollView"])
    
        Cell *cell = (Cell *)sender;
        NSIndexPath *indexPath = [self.collectionView indexPathForCell:cell];

        ScrollViewController *divc = (ScrollViewController *)[segue destinationViewController];
        divc.objects = self.objects;
        divc.index = indexPath.item;
    

注意,我建议集合视图和滚动视图都不要维护图像数组(因为您很快就会遇到内存问题)。如果它是一组图像名称或图像 URL,那就更好了。然后,您可以让cellForItemAtIndexPath 根据需要检索图像,但您可以享受集合视图的全部内存效率。我建议滚动视图采用类似的技术。 (为了让自己的生活更轻松,您可能想要考虑将第二个场景设置为水平集合视图(每个单元格本身占据全屏),或者为自己找到一个很好的无限滚动滚动视图类,可以有效地处理其内存。)

【讨论】:

以上是关于从 UICollectionViewCell 到 UIScrollView 中的正确位置的主要内容,如果未能解决你的问题,请参考以下文章

从 UICollectionViewCell 呈现一个 UIPopoverController

将 UICollectionViewCell 加载到 UIView

Swift - 从 UICollectionViewCell 内的视图中删除约束

从 UICollectionViewCell 中点击按钮时,如何引用 UITableViewCell?

解码后如何恢复 UICollectionViewCell 中的绑定

如何找到 UICollectionViewCell 相对于应用程序窗口的坐标