带自定义标头的UICollectionView

时间:2014-10-30 18:46:10

标签: ios uiscrollview uicollectionview

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

PS。我正在开发iOS8

2 个答案:

答案 0 :(得分:1)

我可以使用Table View Cell原型作为标题,这样我就可以从Interface Builder完成所有工作。也许这也适用于Collection View:

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

    return sectionHeader;
}

我会看:

dequeueReusableSupplementaryViewOfKind:withReuseIdentifier:forIndexPath:

---编辑---

也许我没有用上面的答案完全理解你的问题。你想要一个UIView,你可以直接连接到你的View Controller,但你想让它与Collection View一起滚动?我过去使用的一种技术是在一个UIScrollView中使用UIView和UICollectionView,其中集合视图的宽度/高度始终与它需要的一样大,因此它本身不会获得scrollview,然后应用大小在滚动视图中,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中的任何其他非转发器嵌套项一样易于使用。

答案 1 :(得分:0)

您可以从对象库中删除Collection Reusable View并将其放到集合视图中。然后,您可以在故事板中执行任何您想要的设计,并使用其标识符将其出列,就像您对单元格所做的那样(但是使用 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;
}