0

我有一个集合视图,其中填充了以下数据:

[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 照片库一样滑动浏览收藏视图中包含的图像。

我猜需要一个滚动视图或第二个集合视图,但是我不确定从哪里开始,所以任何指针、示例代码或你们可以提供的任何其他帮助将不胜感激。

谢谢

4

2 回答 2

5

如果您已经有一个可以执行您想要的操作的集合视图,则只需打开分页。self.collectionView.pagingEnabled = YES 您还可以通过选中属性检查器中的分页框来启用 IB 中的分页。使用 aUICollectionView为您提供了可重用单元的额外好处。

编辑

你仍然可以使用 UICollectionView。创建包含您的详细视图的 UICollectionViewCell 子类。然后,当您想直接启动到特定图像时,您可以使用- (void)scrollToItemAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UICollectionViewScrollPosition)scrollPosition animated:(BOOL)animated如果您在此视图中加载大量图像,则 scrollview 方法将立即加载所有图像,而不是像在 collectionview 场景中那样按需加载。你总是可以在滚动视图中解决这个问题,但所有这些工作都是在 UICollectionView 中为你完成的。

编辑2

我在评论中开始了这个,但它变得越来越大......

在您的视图控制器子类中,您需要注册您的类或您创建的用于布置该单元格的 nib。我更喜欢笔尖,所以我可以在 Interface Builder 中布置所有内容。如果你走 nib 路线,你将创建一个空的 xib 并将 UICollectionViewCell 拖出右下角的对象库。然后选择该单元格并确保将 Class 设置为您创建的自定义子类。

现在在您的视图控制器子类中,您将– registerNib:forCellWithReuseIdentifier:像这样调用 viewDidLoad 方法:

   [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;
}
于 2013-05-22T16:52:17.257 回答
0

您应该简单地使用启用分页的 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];
于 2013-05-22T16:08:08.647 回答