Hide UITableView search bar by default when in a navigation controller

前端 未结 5 972
萌比男神i
萌比男神i 2021-02-03 14:05

I\'ve read multiple posts on this but it\'s not working properly for me. I\'m using the latest 4.2 SDK.

The code I have is

self.tableView.contentOffset =         


        
5条回答
  •  囚心锁ツ
    2021-02-03 14:57

    Another approach should be...in viewDidLoad call:

    self.tableView.contentInset = UIEdgeInsetsMake(-self.searchDisplayController.searchBar.frame.size.height, 0, 0, 0);
    

    and implementing endDragging delegate method:

    -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
        CGPoint offset = self.tableView.contentOffset;
    
        CGFloat barHeight = self.searchDisplayController.searchBar.frame.size.height;
        if (offset.y <= barHeight/2.0f) {
            self.tableView.contentInset = UIEdgeInsetsZero;
        } else {
            self.tableView.contentInset = UIEdgeInsetsMake(-barHeight, 0, 0, 0);
        }
    
        self.tableView.contentOffset = offset;
    }
    

    setting content is to remove some "flickering"

    also if You want searchbar to stick at the top, implement didScroll this way:

    -(void)scrollViewDidScroll:(UIScrollView *)scrollView{
         CGRect sbFrame = self.searchDisplayController.searchBar.frame;
         sbFrame.origin.y = self.tableView.contentOffset.y;
         if (sbFrame.origin.y > 0) {
             sbFrame.origin.y = 0;
         }
         self.searchDisplayController.searchBar.frame = sbFrame;
    }
    

    I hope this will help (took me few days to figure out:) )

    Cheers!

    UPDATE:

    As @carbonr noted You should add this line in viewDidLoad since iOS7+

    self.edgesForExtendedLayout = UIRectEdgeNone;
    

提交回复
热议问题