关于UITableView 串烧
滑动到指定位置
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
{
//这里将注意力放在targetContentOffset 存取就好了,设置这个滑动去指定Offset
if (targetContentOffset -> y < aValue) {
*targetContentOffset = CGPointMake(expectX, expectY);
}
}
velocity.y > 0 有向下划的趋势
velocity.y > 0 有向上滑的趋势
项目中的具体情况没有这么简单,tmd外面一个大tableView,cell里面又装着好几个tableView ,这就需要用delegate 或者 notification由下至上,将这个回调传递给最外层的controller了。
另外再贴一下这种情况上下滑动两个tableView相应didScroll方法的回调实现
//_tableView : 大tableView,
//scrollView:cell里面装的tableView,小tableView
//maxOffsetY: 大tableView能滑动的最大位置,可用大tableViewContentSizeY - 小tableView.frame.height
//originOffsetY:大tableView的originOffsetY
- (void)innerTableViewDidScroll:(UIScrollView *)scrollView
{
CGPoint scrollViewPoint = scrollView.contentOffset;
CGPoint detailTableviewContentOffset = _tableView.contentOffset;
//需要设置maxOffset 和 originalOffsetY即可
CGFloat maxOffsetY = headerViewHeight - 64;
if (scrollViewPoint.y > 0 && detailTableviewContentOffset.y < maxOffsetY) {
CGFloat detailTableViewContentOffsetY = originalOffsetY;
if (scrollViewPoint.y + detailTableviewContentOffset.y < maxOffsetY) {
detailTableViewContentOffsetY = scrollViewPoint.y + detailTableviewContentOffset.y;
} else {
detailTableViewContentOffsetY = maxOffsetY;
}
[_tableView setContentOffset:CGPointMake(detailTableviewContentOffset.x, detailTableViewContentOffsetY)];
CGRect scrollViewBounds = scrollView.bounds;
scrollViewBounds.origin = CGPointZero;
scrollView.bounds = scrollViewBounds;
}
if (scrollViewPoint.y < 0 && detailTableviewContentOffset.y > 0) {
CGFloat detailTableViewContentOffsetY = originalOffsetY;
if (scrollViewPoint.y + detailTableviewContentOffset.y > 0) {
detailTableViewContentOffsetY = scrollViewPoint.y + detailTableviewContentOffset.y;
} else {
detailTableViewContentOffsetY = originalOffsetY;
}
[_tableView setContentOffset:CGPointMake(detailTableviewContentOffset.x, detailTableViewContentOffsetY)];
CGRect scrollViewBounds = scrollView.bounds;
scrollViewBounds.origin = CGPointZero;
scrollView.bounds = scrollViewBounds;
}
NSLog(@"container tableview contentOffset:%f", scrollViewPoint.y);
}
使用时需要设置maxOffset 和 originalOffsetY即可
还有这3行值得注意的:
CGRect scrollViewBounds = scrollView.bounds;
scrollViewBounds.origin = CGPointZero;
scrollView.bounds = scrollViewBounds;
每次移动后记得将origin 归零。
自定navigationBar alpha 随tableView 滑动变化
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
CGFloat scrollOffsetY = scrollView.contentOffset.y;
[self setNavigationBarAlphaWithContentOffset:scrollOffsetY];
}
- (void)setNavigationBarAlphaWithContentOffset:(CGFloat)y
{
_navigationBar.alpha = y / (headerViewHeight - 64);
}
当navigationBar 下沿到达 headerViewHeight 的下沿时,navigationBar.alpha = 1;
需要注意的,分母记得减去statusbarheight(20) + navigationBarHeight(44)