Set UITableView content inset permanently

前端 未结 8 734
余生分开走
余生分开走 2020-12-07 12:24

In my app I have a UISearchBar under UINavigationBar so it is always visible to user. In that case I had to set contentInset with extr

相关标签:
8条回答
  • 2020-12-07 12:35

    Add in numberOfRowsInSection your code [self.tableView setContentInset:UIEdgeInsetsMake(108, 0, 0, 0)];. So you will set your contentInset always you reload data in your table

    0 讨论(0)
  • 2020-12-07 12:39

    In Swift:

    override func viewDidLayoutSubviews() {
          super.viewDidLayoutSubviews()
          self.tableView.contentInset = UIEdgeInsets(top: 108, left: 0, bottom: 0, right: 0)
    }
    
    0 讨论(0)
  • 2020-12-07 12:42

    automaticallyAdjustsScrollViewInsets is deprecated in iOS11 (and the accepted solution no longer works). use:

    if #available(iOS 11.0, *) {
        scrollView.contentInsetAdjustmentBehavior = .never
    } else {
        automaticallyAdjustsScrollViewInsets = false
    }
    
    0 讨论(0)
  • 2020-12-07 12:43

    Probably it was some sort of my mistake because of me messing with autolayouts and storyboard but I found an answer.

    You have to take care of this little guy in View Controller's Attribute Inspector asvi

    It must be unchecked so the default contentInset wouldn't be set after any change. After that it is just adding one-liner to viewDidLoad:

    [self.tableView setContentInset:UIEdgeInsetsMake(108, 0, 0, 0)]; // 108 is only example
    

    iOS 11, Xcode 9 update

    Looks like the previous solution is no longer a correct one if it comes to iOS 11 and Xcode 9. automaticallyAdjustsScrollViewInsets has been deprecated and right now to achieve similar effect you have to go to Size Inspector where you can find this:
    Also, you can achieve the same in code:

    if #available(iOS 11.0, *) {
        scrollView.contentInsetAdjustmentBehavior = .never
    } else {
        automaticallyAdjustsScrollViewInsets = false
    }
    
    0 讨论(0)
  • 2020-12-07 12:44

    After one hour of tests the only way that works 100% is this one:

    -(void)hideSearchBar
    {
        if([self.tableSearchBar.text length]<=0 && !self.tableSearchBar.isFirstResponder)
        {
            self.tableView.contentOffset = CGPointMake(0, self.tableSearchBar.bounds.size.height);
            self.edgesForExtendedLayout = UIRectEdgeBottom;
        }
    }
    
    -(void)viewDidLayoutSubviews
    {
        [self hideSearchBar];
    }
    

    with this approach you can always hide the search bar if is empty

    0 讨论(0)
  • 2020-12-07 12:47

    Try setting tableFooterView tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: CGFloat.leastNonzeroMagnitude))

    0 讨论(0)
提交回复
热议问题