I'm Terrence

tableView 大串烧

关于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)