美文网首页iOS开发者
UITableView和UIScrollView滚动方向的判断

UITableView和UIScrollView滚动方向的判断

作者: ma_yongsong | 来源:发表于2018-03-17 18:10 被阅读166次

    1、首先为UITableView添加观察者

    [tableView addObserver: self forKeyPath: @"contentOffset" options: NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context: nil];
    

    2、在KVO中,根据UITableView对象的相关属性,完成UITableView滚动方向的判断

    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
        if ([object isKindOfClass: [UITableView class]]) {
            CGPoint newPoint = [change[@"new"] CGPointValue];
            CGPoint oldPoint = [change[@"old"] CGPointValue];
            CGFloat newPointY = newPoint.y;
            CGFloat oldPointY = oldPoint.y;
            CGFloat frameHeight = ((UITableView *)object).frame.size.height;
            CGFloat contentSizeHeight = ((UITableView *)object).contentSize.height;
    
            //  这个地方把contentSizeHeight强制转为long类型很重要,因为本身它是CGFloat类型,所以可能会带有浮点数
            // 一般我们在做表格的时候,实际上正数居多,为什么用long而不是int,主要是表示的整数范围会更大
            if ((newPointY < oldPointY && (frameHeight + newPointY) < (long)contentSizeHeight) || newPointY < 0 || oldPointY < 0) {
                if (newPointY <= 0 || oldPointY <= 0) {
                    NSLog(@"top");
                } else {
                    NSLog(@"scroll down");
                }
            } else if (newPointY > oldPointY) {
                if ((frameHeight + newPointY >= contentSizeHeight)) {
                    NSLog(@"bottom");
                } else {
                    NSLog(@"scroll up");
                }
            }
        }
    }
    

    相关文章

      网友评论

      • 玉树临风的少年:为什么不在scrollviewdidscroll做判断呢
        ma_yongsong:@玉树临风的少年 两种方式应该都是可行的,之前我也是用的你说的方式,只是需要用额外的变量保存旧的滚动值
        玉树临风的少年:@ma_yongsong 用一个属性存旧值不就好了,只因为获取旧值就用KVO会不会太麻烦
        ma_yongsong:@玉树临风的少年 因为要和旧的滚动值做对比,所以用了kvo

      本文标题:UITableView和UIScrollView滚动方向的判断

      本文链接:https://www.haomeiwen.com/subject/bvijqftx.html