如何在顶部 UICollectionView 上制作粘性标题
Posted
技术标签:
【中文标题】如何在顶部 UICollectionView 上制作粘性标题【英文标题】:How to make a sticky header on top UICollectionView 【发布时间】:2018-04-26 02:02:13 【问题描述】:目前我的 UICollectionView 中有一个标题单元格。当我尝试滚动 UICollectionView 时,标题单元格将与 UICollectionView 列表一起滚动。 我可以知道如何将标题单元格设置在顶部吗?请帮忙。谢谢。
我目前的结果:-
我的预期结果:-
这是我的 ViewController 中标题单元格的示例代码:-
- (UICollectionView *)collectionView
if (!_collectionView)
DCHoverFlowLayout *layout = [DCHoverFlowLayout new];
_collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];
_collectionView.frame = CGRectMake(0, DCTopNavH, ScreenW, ScreenH - DCTopNavH);
_collectionView.showsVerticalScrollIndicator = NO;
_collectionView.delegate = self;
_collectionView.dataSource = self;
[_collectionView registerClass:[Product_HeadView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:Product_HeadViewID];
return _collectionView;
- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
UICollectionReusableView *reusableview = nil;
if (kind == UICollectionElementKindSectionHeader)
Product_HeadView *headerView = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:Product_HeadViewID forIndexPath:indexPath];
WEAKSELF
;
reusableview = headerView;
return cell;
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
_lastContentOffset = scrollView.contentOffset.y;
-(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView
if(scrollView.contentOffset.y > _lastContentOffset)
[self.navigationController setNavigationBarHidden:YES animated:YES];
self.collectionView.frame = CGRectMake(0, 20, ScreenW, ScreenH - 20);
self.view.backgroundColor = [UIColor whiteColor];
else
[self.navigationController setNavigationBarHidden:NO animated:YES];
self.collectionView.frame = CGRectMake(0, DCTopNavH, ScreenW, ScreenH - DCTopNavH);
self.view.backgroundColor = ThemeBackgroundColor;
#pragma mark - <UIScrollViewDelegate>
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
//Detect Button Visible
_backTopButton.hidden = (scrollView.contentOffset.y > ScreenH) ? NO : YES;
WEAKSELF
[UIView animateWithDuration:0.25 animations:^
__strong typeof(weakSelf)strongSelf = weakSelf;
strongSelf.footprintButton.dc_y = (strongSelf.backTopButton.hidden == YES) ? ScreenH - 60 : ScreenH - 110;
];
更新:-
应用 Ted 的代码后,结果如下,应用程序将崩溃。
【问题讨论】:
【参考方案1】:tedd 的 Swift 版本的回答:
let layout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
layout.sectionHeadersPinToVisibleBounds = true
【讨论】:
哇,这解决了我在 ios 12 上的问题。iOS 13 已经运行良好。如此随意的苹果,如此随意。【参考方案2】:在您的 viewForSupplementaryElementOfKind
方法中。添加这些行:
UICollectionViewFlowLayout *layout = collectionView.collectionViewLayout;
layout.sectionHeadersPinToVisibleBounds = YES;
【讨论】:
嗨,泰德,我在应用您的代码时遇到了这个错误:- 使用“UICollectionViewLayout *”类型的表达式初始化“UICollectionViewFlowLayout *”的指针类型不兼容。有什么想法吗? 你试过运行它吗?就我而言,这只是一个警告。 嗨泰德,请参阅我的截图。应用后应用会崩溃 崩溃信息是什么? 索引路径 (一种选择是使用UIViewController
而不是UICollectionViewController
。将要用作标题的视图添加到视图控制器,然后在该标题视图下方添加一个集合视图。
这样标题就不是集合视图的一部分,它根本不会滚动。
【讨论】:
嗨 rmaddy,目前我在标题单元格中使用 @interface Product_HeadView : UICollectionReusableView。你的意思是改变这个?以上是关于如何在顶部 UICollectionView 上制作粘性标题的主要内容,如果未能解决你的问题,请参考以下文章
当有人滚动到 UICollectionView 的顶部时,如何调用方法?
如何在 UICollectionView 顶部添加一个视图以支持诸如搜索栏或 Objective-c 中的过滤器之类的内容?
向 UICollectionview 添加一个顶部标题,该标题已经包含带有标题的部分
如何在UICollectionView中添加HeaderView,如UITableView的tableHeaderView