滚动视图还是集合视图?
Posted
技术标签:
【中文标题】滚动视图还是集合视图?【英文标题】:ScrollView or CollectionView? 【发布时间】:2013-05-22 14:14:50 【问题描述】:我有一个包含以下数据的集合视图:
[self.graniteImages addObject:[[NSMutableDictionary alloc]
initWithObjectsAndKeys:@"Angel Cream", @"name",
@"angel-cream.jpg", @"image", nil]];
[self.graniteImages addObject:[[NSMutableDictionary alloc]
initWithObjectsAndKeys:@"Angola Black", @"name" ,
@"angola_black1.jpg", @"image" , nil]];
然后转到静态的详细视图。
我现在想向详细视图添加分页,以便我可以像 iPhone 照片库一样在收藏视图中滑动浏览包含的图像。
我猜可能需要一个滚动视图或第二个集合视图,但我不知道从哪里开始,所以任何指针、示例代码或你们可以提供的任何其他帮助将不胜感激。
谢谢
【问题讨论】:
【参考方案1】:如果您已经有一个可以执行您想要的操作的集合视图,只需打开分页即可。 self.collectionView.pagingEnabled = YES
您还可以通过选中属性检查器中的分页框来启用 IB 中的分页。使用UICollectionView
为您提供了可重用单元的额外好处。
编辑
您仍然可以使用 UICollectionView。创建包含您的详细视图的 UICollectionViewCell 子类。然后,当您想直接启动到特定图像时,您可以使用- (void)scrollToItemAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UICollectionViewScrollPosition)scrollPosition animated:(BOOL)animated
如果您在此视图中加载大量图像,则滚动视图方法将立即加载所有图像,而不是像在集合视图中那样按需加载设想。您始终可以在滚动视图中解决这个问题,但所有这些工作都已在 UICollectionView 中为您完成。
编辑2
我在评论中开始了这个,但它变得越来越大......
在您的视图控制器子类中,您需要注册您的类或您创建的用于布置该单元格的 nib。我更喜欢笔尖,所以我可以在 Interface Builder 中布置所有内容。如果你走 nib 路线,你将创建一个空的 xib 并将 UICollectionViewCell 拖出右下角的对象库。然后选择该单元格并确保将 Class 设置为您创建的自定义子类。
现在在您的视图控制器子类中,您将在 viewDidLoad 方法中调用 – registerNib:forCellWithReuseIdentifier:
,如下所示:
[self.collectionView registerNib:[UINib nibWithNibName:@"WhateverYouNamedYourNib" bundle:nil] forCellWithReuseIdentifier:@"cell"];
您的视图控制器将符合UICollectionViewDataSource
协议,您将实现此方法:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
CustomCellClass *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath
//Setup the cell with image and whatever else
return cell;
【讨论】:
它在我想要分页的详细视图上而不是在集合视图上,我使用集合视图作为初始图像网格,然后传递到详细视图以获得全屏图像。 啊,对不起。我误读了这个问题......我更新了我的答案。 太棒了,听起来不错,不过我完全是个菜鸟,所以我可能有几个问题!我创建了 UICollectionViewCell 的子类,但无法将任何内容链接到它?你可能不得不像在动物园里和一只猴子说话一样解释这一点! 如果我使用情节提要也一样吗?我真的很感谢这里的帮助:) 没有故事板是不同的野兽。您在情节提要中创建原型单元。诚然,我没有使用故事板,所以我不是一个很好的人。我确实从这个 SO 问题 ***.com/questions/14530416/… 中找到了这个链接 ashfurrow.com/blog/uicollectionview-example 它看起来很简单【参考方案2】:您应该简单地使用启用分页的 UIScrollView。以下代码应该可以解决问题:
NSInteger numberOfImages = [self.graniteImages count];
CGRect bounds = self.scrollView.bounds;
self.scrollView.contentSize = CGSizeMake(bounds.size.width * numberOfImages, bounds.size.height);
scrollView.pagingEnabled = YES;
CGFloat x = 0;
for (NSMutableDictionary *dict in images)
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[dict valueForKey:@"image"]]];
imageView.frame = CGRectMake(x, 0, bounds.size.width, bounds.size.height);
[scrollView addSubview:imageView];
x += self.view.bounds.size.width;
编辑:此代码将进入您的详细视图控制器的 ViewDidLoad 方法。 您的详细视图控制器还应该有一个 NSUInteger 类型的属性索引和一个 NSMutableArray* 类型的 graniteImages 属性,您可以在集合视图控制器的 prepareForSegue 方法中设置它们,就像:
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if( [segue.identifier isEqualToString:@"yourSegue"])
((DetailViewController*)segue.destinationViewController).graniteImages = self.graniteImages;
((DetailViewController*)segue.destinationViewController).index = self.tappedImageIndex;
并在您的 ViewDidLoad 方法中添加:
[scrollView scrollRectToVisible:CGRectMake(bounds.size.width * self.index, 0, bounds.size.width, bounds.size.height) animated:NO];
【讨论】:
我假设我会将该代码添加到详细视图并导入主 collectionview.h?然后我将如何设置它以便集合视图推送到相关图像?哦,我也可以把标题拿过来吗?抱歉,对这一切真的很陌生! 检查我编辑的答案,至于标题,你已经在 NSMutableDictionary *graniteImages 中有它,所以你可以用它做任何你喜欢的事情! :)以上是关于滚动视图还是集合视图?的主要内容,如果未能解决你的问题,请参考以下文章
UIColectionView Vertical Scrolling inside a Scrollview - 在集合视图区域中滚动时禁用滚动视图的滚动