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 extra 44px so the UIScrollView
will be scrolling under UISearchBar
(exactly like in Contacts.app). And there would be no problem with static UITableView
's but in my case I have to reload it's contents, switch to UISearchDisplayController
etc. So when I call:
[self.tableView setContentInset:UIEdgeInsetsMake(108, 0, 0, 0)];
Everything works until e.g. I pull to refresh... (for this I use SSPullToRefresh
).
So my question is: How can I set contentInset
permanently so I wouldn't have to worry about any changes happening to data inside UITableView
?
This question is related to
ios
objective-c
uitableview
uiscrollview
pull-to-refresh
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
automaticallyAdjustsScrollViewInsets is deprecated in iOS11 (and the accepted solution no longer works). use:
if #available(iOS 11.0, *) {
scrollView.contentInsetAdjustmentBehavior = .never
} else {
automaticallyAdjustsScrollViewInsets = false
}
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
In Swift:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.tableView.contentInset = UIEdgeInsets(top: 108, left: 0, bottom: 0, right: 0)
}
This is how it can be fixed easily through Storyboard (iOS 11 and Xcode 9.1):
Select Table View > Size Inspector > Content Insets: Never
Try setting tableFooterView tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: CGFloat.leastNonzeroMagnitude))
self.rx.viewDidAppearOnce
.flatMapLatest { _ in RxKeyboard.instance.isHidden }
.bind(onNext: { [unowned self] isHidden in
guard !isHidden else { return }
self.tableView.beginUpdates()
self.tableView.contentInsetAdjustmentBehavior = .automatic
self.tableView.endUpdates()
})
.disposed(by: self.disposeBag)
Source: Stackoverflow.com