美文网首页收藏ios
tableView滑动全屏显示

tableView滑动全屏显示

作者: Flysss1219 | 来源:发表于2017-10-28 09:51 被阅读61次

    今天要分享的一个效果是在一个页面弹出视图展示一个tableview,然后手指滑动tableview时,视图随着tableview偏移量增加而慢慢增加,到达临界时,全屏显示,然后再次向下滑动时,当偏移量到达临界点,视图逐渐缩小,最终恢复正常大小,页面效果可以参考高德导航界面。
    这里贴上效果图
    这是高德导航的效果


    2DB81CA4986551A919D73A39C5303500.png 208F6135CA04A1942510F569FFECD843.png

    我们实现的效果

    51854156044B1B06EA213DFE9034E90F.png 8DA4ADD53A6CEC99E1394C516DCCBBA3.jpg 5009C1C6540087365188D3114C841E31.jpg

    现在我们开始实现这个效果。
    要实现这个效果我们最容易想到的就是给tableview的偏移量进行监听。

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

    然后实现监听的方法

    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
    {
        if ([keyPath isEqualToString:@"contentOffset"])
        {
            CGPoint offset = [change[NSKeyValueChangeNewKey] CGPointValue];
            NSLog(@"offset:%f",offset.y);
            if (offset.y < KDeviceHeight/3-20) {
                if (offset.y+_tableView.height <= _tableView.contentSize.height) {
                    [self.upButton setImage:[UIImage imageNamed:@"house_icon_up"] forState:UIControlStateNormal];
                    CGRect rect = self.frame;
                    rect.origin.y = KDeviceHeight/3-offset.y;
                    rect.size.height = KDeviceHeight/3*2+offset.y;
                    self.frame = rect;
                    CGRect rec1 = self.tableView.frame;
                    rec1.size.height = KDeviceHeight/3*2+offset.y-44;
                    self.tableView.frame = rec1;
                }
            }else if(offset.y >= KDeviceHeight/3-20 && offset.y <= KDeviceHeight){
                self.frame = CGRectMake(0,20, KDeviceWidth, KDeviceHeight-20);
                self.tableView.frame = CGRectMake(0, 44, KDeviceWidth, self.height-44);
                [self.upButton setImage:[UIImage imageNamed:@"house_icon_down"] forState:UIControlStateNormal];
            }
            else{
                return;
            }
        }
    }
    

    这个效果应该是挺简单的一个效果,实现起来也并不复杂。
    这样就基本实现了这效果。

    tips:
    这里再讲一下,做这个效果遇到的坑。
    1、

    if (offset.y+_tableView.height <= _tableView.contentSize.height) 
    

    这个判断的作用:是为了在tableview滑动距离不够的时候,不使它滑动,如果不做这个判断,会导致的问题是:数据量少,tableview可滑动的高度不够,在执行滑动方式是会导致剧烈的上下抖动,非常影响体验。做这个判断就是为了消除这个影响,在它的contentSize足够的时候才使他滑动。
    2、

    else if(offset.y >= KDeviceHeight/3-20 && offset.y <= KDeviceHeight){
                self.frame = CGRectMake(0,20, KDeviceWidth, KDeviceHeight-20);
                self.tableView.frame = CGRectMake(0, 44, KDeviceWidth, self.height-44);
                [self.upButton setImage:[UIImage imageNamed:@"house_icon_down"] forState:UIControlStateNormal];
            }
            else{
                return;
            }
    

    这个部分的作用是:
    else if(offset.y >= KDeviceHeight/3-20 && offset.y <= KDeviceHeight)
    这个判断是当tableview滑动到达临界点是全屏,不再滑动。本来代码到这里就结束了,后来给产品测试的时候发现个问题,就是当tableview数据量特别多的时候,快速滑动时有可能滑动不流畅甚至会卡住不懂的情况。为了解决这个bug,我的做法是让滑动超过某个值(这个值随意只要大于临界值就可以),tableview全屏后就不再执行监听偏移的方法了,给他return掉。这里我也不是特别明白为什么会出现这个问题,也希望有人给我解答下。

    相关文章

      网友评论

        本文标题:tableView滑动全屏显示

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