Move a view when scrolling in UITableView
Solution for Swift (Works perfectly with bounce enabled for scroll view):
var oldContentOffset = CGPointZero let topConstraintRange = (CGFloat(120)..<CGFloat(300)) func scrollViewDidScroll(scrollView: UIScrollView) { let delta = scrollView.contentOffset.y - oldContentOffset.y //we compress the top view if delta > 0 && topConstraint.constant > topConstraintRange.start && scrollView.contentOffset.y > 0 { topConstraint.constant -= delta scrollView.contentOffset.y -= delta } //we expand the top view if delta < 0 && topConstraint.constant < topConstraintRange.end && scrollView.contentOffset.y < 0{ topConstraint.constant -= delta scrollView.contentOffset.y -= delta } oldContentOffset = scrollView.contentOffset }
Since UITableView
is a subclass of UIScrollView
, your table view's delegate can receive UIScrollViewDelegate
methods.
In your table view's delegate:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView { static CGFloat previousOffset; CGRect rect = self.view.frame; rect.origin.y += previousOffset - scrollView.contentOffset.y; previousOffset = scrollView.contentOffset.y; self.view.frame = rect;}
More simple and fast approach
- (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGRect rect = self.view.frame; rect.origin.y = -scrollView.contentOffset.y; self.view.frame = rect;}