2014-10-30 97 views
0

我正在尝试开发支持包含UIScrollview的自定义标题的UICollectionView。问题是(根据我迄今在文档中发现的)UICollection视图不支持像UITableview这样的静态头部视图(在这里我可以使用storyboard来放置一个视图)。标题是一个UICollectionResusableView实例,每次收集视图上下滚动时都会重新生成该实例。很明显,这种视图不能连接到插座,因为它是一个像UITableViewCell这样的动态原型。 如何添加自定义视图(和相对视图控制器,我可以连接)作为我的收藏视图的标题?UICollectionView与自定义标题

PS。我正在开发iOS8

回答

1

我可以使用Table View Cell原型作为标题,这样我就可以完成Interface Builder中的所有工作。也许,这是适用于集合视图,以及:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
    AXSHomeSectionHeaderCell *sectionHeader = [tableView dequeueReusableCellWithIdentifier:@"Home Section Header"]; 

    return sectionHeader; 
} 

我想看看:

dequeueReusableSupplementaryViewOfKind:withReuseIdentifier:forIndexPath: 

---编辑---

也许我没有完全理解你的问题与上面的答案。你想要一个UIView,你可以直接连接到你的视图控制器,但你希望它与Collection视图一起滚动?我过去使用的一种技术是在一个UIScrollView中使用UIView和UICollectionView,其中集合视图的宽度/高度总是尽可能大,因此它不会获得滚动视图本身,然后应用大小到滚动视图UIView和UICollectionView都在,所以他们滚动为一体。

这是我如何处理这种情况:

我有一个UIScrollView与一个UIView如在顶部和低于一个UICollectionView的报头。 UIScrollView具有决定自动布局约束的高度,需要将其设置为其内部两个视图内容的高度(也可能是宽度)。我只知道在加载数据后收集视图有多大,所以我在重新加载并在此之后调整大小后开始测量。

// Method being called after I successfully fetched my data 
- (void)handleSuccess:(HomeScreenData *)homeScreen { 
    self.eventsCollectionViewDatasource.featuredEvents = homeScreen.events; 

    [self.eventsCollectionView reloadData]; 

    float headerHeight = CGRectGetHeight(self.headerView.frame); 
    float eventsCollectionHeight = self.eventsCollectionView.contentSize.height; 

    float totalScrollerHeight = headerHeight + eventsCollectionHeight; // This is how tall the scroller should be, you can do more fancy stuff if you need the width as well 

    self.scrollViewContainerViewHeight.constant = totalScrollerHeight; // With autolayouts, use whatever you like 
} 

它也将支持滚动滚动!事实上,我用它是一个旋转木马类型的收集视图顶部横向滚动和它下面的一个表,它垂直滚动在一起与顶级集合视图为基础的传送带。它与Interface Builder中的任何其他非重复嵌套项目一样平易近人。

+0

我在想你在编辑中描述的方法,但我对性能有点担心,因为在这种情况下单元不会被重用。我想有可能会丢弃一个静态的UIView作为CollectionView的头部,就像在UITableView中一样,但它看起来好像不可能 – Claus 2014-10-31 10:18:18

+0

我强烈建议采取这种方法,您可以在Collection中查看所有需要显示的大小所有的单元格,并把它们放在一起,在它们自己的scrollview中包含一个头部UIView。这听起来像你试图弯曲UICollectionView太多了。如果你有耐心,我可以搜索一些我的代码并发布。 – 2014-10-31 13:25:02

+0

我会努力的,听起来像是一个很好的解决方案。谢谢! – Claus 2014-10-31 14:21:33

0

您可以从对象库中删除集合可重用视图并将其放到您的集合视图中。然后,您可以在故事板中执行任何您想要的设计,并使用其标识符将其出列,就像您对单元格执行操作一样(但使用 dequeueReusableSupplementaryViewOfKind:withReuseIdentifier:forIndexPath:您在数据源方法中执行的操作, collectionView:viewForSupplementaryElementOfKind:atIndexPath :)。

-(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { 
    RDReusableHeader *headerView = nil; // this is my subclass of a UICollectionReusableView 
    if (kind == UICollectionElementKindSectionHeader){ 
     headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"MyView" forIndexPath:indexPath]; 
     // configure the view here 
    } 

    return headerView; 
} 
+0

这就是我现在正在做的事情,但如果我把UIScrollview放在Collection Reusable View中,每当我作为他可重用的一部分滚动时,它都会被重新创建。我需要一个类似于UITableView的静态视图 – Claus 2014-10-31 10:15:53