Mac BCCollectionView的使用(三)

        有时候需要设置BCCollectionView的header信息。介绍下BCCollectionView的使用方式。

1. 加载数据

        这里跟不适用header时的加载方法不一样。

    NSArray *dataSource = [[NSArray alloc] initWithObjects:@"data1", @"data2", @"data3", @"data4", nil];
    
    BCCollectionViewGroup *viewGroup = [[BCCollectionViewGroup alloc] init];
    viewGroup.isCollapsed = NO;
    
    NSRange range = NSMakeRange(0, [self.dataSource count] - 1);  
    viewGroup.itemRange = range;  // 这里设置Group对应的dataSource的索引
    
    // 这里不进行retain的话,会导致crash, 还没查具体原因
    NSArray *group = [[NSArray arrayWithObjects:viewGroup, nil] retain];  
    
    [self reloadDataWithItems:dataSource groups:group emptyCaches:YES];

2. 实现回调

        2.1 返回header的高

        - (NSUInteger)groupHeaderHeightForCollectionView:(BCCollectionView *)collectionView {
            return 140;
        }
        2.2 创建header

        - (NSViewController *)collectionView:(BCCollectionView *)collectionView headerForGroup:(BCCollectionViewGroup *)group {
                // 这里需要创建并返回一个自己定义的header对象
                BCCollectionHeaderViewController *headerViewController = [[BCCollectionHeaderViewController alloc] initWithNibName:@"BCCollectionHeaderViewController" bundle:nil];

            return headerViewController;
        }
        

另外,当使用BCCollectionView的header的时候,BCCollectionView存在BUG。 当hearder的高度是可以动态变化时,增加header的高,需要重新加载数据,这时会刷新header数据和当前区域可见的cell的数据。但是当Cell区域由屏幕内可见变为不可见时,系统会重刷所有Cell内容。其实现在Cell不在当前可视区域内显示,所以没有必要刷新Cell区域,而只需要刷新header区域。规避这种问题的一种方法为:当重新加载数据时,判断加载是否完成,如果未完成,则当前界面外的cell不进行刷新。示例代码为:

        void(^reloadcompletionBlock)(void) = ^(void) {  
            isLoading = NO;   // 加载完成,取消正在加载状态
        };  
        
        isLoading = YES;      // 设置正在加载状态
        [collectionView reloadDataWithItems:dataSource groups:group emptyCaches:YES completionBlock:reloadcompletionBlock];
        
        - (void)collectionView:(BCCollectionView *)collectionView willShowViewController:(NSViewController *)viewController forItem:(id)anItem {
            // 如果正在加载,则不设置当前屏幕区域外的Cell数据
            if (isLoading) {
                if (viewController.view.frame.origin.y > self.window.frame.size.height) {
                    return;
                }
            }
        }




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值