46451

how to add Header for section in collection view on top below

Question:

I am using collection view with search bar. i Have added search bar via cod with (0,0) orgin from top . so now my image look like this:

[![enter image description here][1]][1]

But i need to header below to my search bar . i did via story board.But while run my header name & search bar are in same orgin.I need to place my header section at below myseaarch bar.

<strong>Note: I am sing 3 section header.any idea or code is very help ful.</strong>

Here my code for search bar...

#import "CollectionViewController.h" #import "CollectionViewCell.h" @interface CollectionViewController ()<UISearchBarDelegate> @property (nonatomic,strong) NSArray *dataSource; @property (nonatomic,strong) NSArray *dataSourceForSearchResult; @property (nonatomic) BOOL searchBarActive; @property (nonatomic) float searchBarBoundsY; @property (nonatomic,strong) UISearchBar *searchBar; @property (nonatomic,strong) UIRefreshControl *refreshControl; @end @implementation CollectionViewController static NSString * const reuseIdentifier = @"Cell"; - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. // datasource used when user search in collectionView self.dataSourceForSearchResult = [NSArray new]; // normal datasource self.dataSource =@[@"Modesto",@"Rebecka",@"Andria",@"Sergio",@"Robby",@"Jacob",@"Lavera",@"Theola",@"Adella",@"Garry", @"Lawanda", @"Christiana", @"Billy", @"Claretta", @"Gina", @"Edna", @"Antoinette", @"Shantae", @"Jeniffer", @"Fred", @"Phylis", @"Raymon", @"Brenna", @"Gus", @"Ethan", @"Kimbery", @"Sunday", @"Darrin", @"Ruby", @"Babette", @"Latrisha", @"Dewey", @"Della", @"Dylan", @"Francina", @"Boyd", @"Willette", @"Mitsuko", @"Evan", @"Dagmar", @"Cecille", @"Doug", @"Jackeline", @"Yolanda", @"Patsy", @"Haley", @"Isaura", @"Tommye", @"Katherine", @"Vivian"]; } -(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; [self prepareUI]; } -(void)dealloc{ // remove Our KVO observer [self removeObservers]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } #pragma mark - actions -(void)refreashControlAction{ [self cancelSearching]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // stop refreshing after 2 seconds [self.collectionView reloadData]; [self.refreshControl endRefreshing]; }); } #pragma mark - <UICollectionViewDataSource> - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { return 1; } - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { if (self.searchBarActive) { return self.dataSourceForSearchResult.count; } return self.dataSource.count; } - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { CollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:reuseIdentifier forIndexPath:indexPath]; // Configure the cell if (self.searchBarActive) { cell.laName.text = self.dataSourceForSearchResult[indexPath.row]; }else{ cell.laName.text = self.dataSource[indexPath.row]; } return cell; } #pragma mark - <UICollectionViewDelegateFlowLayout> - (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{ return UIEdgeInsetsMake(self.searchBar.frame.size.height, 0, 0, 0); } - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{ CGFloat cellLeg = (self.collectionView.frame.size.width/2) - 5; return CGSizeMake(cellLeg,cellLeg);; } #pragma mark - search - (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope{ NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"self contains[c] %@", searchText]; self.dataSourceForSearchResult = [self.dataSource filteredArrayUsingPredicate:resultPredicate]; } - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ // user did type something, check our datasource for text that looks the same if (searchText.length>0) { // search and reload data source self.searchBarActive = YES; [self filterContentForSearchText:searchText scope:[[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]]; [self.collectionView reloadData]; }else{ // if text lenght == 0 // we will consider the searchbar is not active self.searchBarActive = NO; } } - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{ [self cancelSearching]; [self.collectionView reloadData]; } - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{ self.searchBarActive = YES; [self.view endEditing:YES]; } - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{ // we used here to set self.searchBarActive = YES // but we'll not do that any more... it made problems // it's better to set self.searchBarActive = YES when user typed something [self.searchBar setShowsCancelButton:YES animated:YES]; } - (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar{ // this method is being called when search btn in the keyboard tapped // we set searchBarActive = NO // but no need to reloadCollectionView self.searchBarActive = NO; [self.searchBar setShowsCancelButton:NO animated:YES]; } -(void)cancelSearching{ self.searchBarActive = NO; [self.searchBar resignFirstResponder]; self.searchBar.text = @""; } #pragma mark - prepareVC -(void)prepareUI{ [self addSearchBar]; [self addRefreshControl]; } -(void)addSearchBar{ if (!self.searchBar) { self.searchBarBoundsY = self.navigationController.navigationBar.frame.size.height + [UIApplication sharedApplication].statusBarFrame.size.height; self.searchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(0,self.searchBarBoundsY, [UIScreen mainScreen].bounds.size.width, 44)]; self.searchBar.searchBarStyle = UISearchBarStyleMinimal; self.searchBar.tintColor = [UIColor whiteColor]; self.searchBar.barTintColor = [UIColor whiteColor]; self.searchBar.delegate = self; self.searchBar.placeholder = @"search here"; [[UITextField appearanceWhenContainedIn:[UISearchBar class], nil] setTextColor:[UIColor whiteColor]]; // add KVO observer.. so we will be informed when user scroll colllectionView [self addObservers]; } if (![self.searchBar isDescendantOfView:self.view]) { [self.view addSubview:self.searchBar]; } } -(void)addRefreshControl{ if (!self.refreshControl) { self.refreshControl = [UIRefreshControl new]; self.refreshControl.tintColor = [UIColor whiteColor]; [self.refreshControl addTarget:self action:@selector(refreashControlAction) forControlEvents:UIControlEventValueChanged]; } if (![self.refreshControl isDescendantOfView:self.collectionView]) { [self.collectionView addSubview:self.refreshControl]; } } -(void)startRefreshControl{ if (!self.refreshControl.refreshing) { [self.refreshControl beginRefreshing]; } } #pragma mark - observer - (void)addObservers{ [self.collectionView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil]; } - (void)removeObservers{ [self.collectionView removeObserver:self forKeyPath:@"contentOffset" context:Nil]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(UICollectionView *)object change:(NSDictionary *)change context:(void *)context{ if ([keyPath isEqualToString:@"contentOffset"] && object == self.collectionView ) { self.searchBar.frame = CGRectMake(self.searchBar.frame.origin.x, self.searchBarBoundsY + ((-1* object.contentOffset.y)-self.searchBarBoundsY), self.searchBar.frame.size.width, self.searchBar.frame.size.height); } } @end

Answer1:

The header can be added in the storyboard by checking <strong>Section Header</strong> under the attribute inspector:

<a href="https://i.stack.imgur.com/dAfQT.png" rel="nofollow"><img alt="enter image description here" class="b-lazy" data-src="https://i.stack.imgur.com/dAfQT.png" data-original="https://i.stack.imgur.com/dAfQT.png" src="https://etrip.eimg.top/images/2019/05/07/timg.gif" /></a>

You also need to implement the following method in your collection view data source:

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { UICollectionReusableView *view = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"header" forIndexPath:indexPath]; return view; }

where the identifier is also set in the storyboard for the header.

The header height can be controlled by the delegate method:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section { return CGSizeMake(0, 80); }

Here is how the storyboard will look:

<a href="https://i.stack.imgur.com/siuxA.png" rel="nofollow"><img alt="enter image description here" class="b-lazy" data-src="https://i.stack.imgur.com/siuxA.png" data-original="https://i.stack.imgur.com/siuxA.png" src="https://etrip.eimg.top/images/2019/05/07/timg.gif" /></a>

You may have trouble obtaining the correct layout as you are manually adding the search bar. The search bar can be added in the storyboard. If you choose to add the search bar in the storyboard, you will have to re-structure your views, including your collection view, so that they are contained in a parent view. Otherwise, you have to manually manipulate the constraints to get the correct positioning for the search bar.

Answer2:

<strong>@Daniel Zhang</strong> says, You are scroll in vertical way. so you can not use x-axis to change the position.But you can do one thing .....do the steps:

1. Add the code @Daniel Zhang suggest and do 2. In story board make the header size height = 80, then place the label over there. 3. Then add constraint (i.e as you want where to place your header title).Then give background color for label. so that it will show different from your cell,searchbar. 4. Make you cell top = 0. You can do when you click your collection view & move to size inspector.

Thats it , Run and see you will see your header differ and from cell,search bar.

Try this its work for me.If it din't work.Try to see this <a href="https://github.com/sambudda/UICollectionViewWithSearchBar" rel="nofollow">demo project where they use search bar using story-board</a>

Recommend