zoukankan      html  css  js  c++  java
  • 下拉刷新和上拉加载的原理

    很多App中,新闻或者展示类都存在下拉刷新和上拉加载的效果,网上提供了实现这种效果的第三方类(详情请见MJRefreshEGOTableViewPullRefresh),用起来很方便,但是闲暇之余,我们可以思考下,这种效果实现的原理是什么,我以前说过,只要是动画都是骗人的,只要不是硬件问题大部分效果都能在系统UI的基础上做出来.

                @下面是关键代码分析:

     
    1. // 下拉刷新的原理  
    2. - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView  
    3. {  
    4.     if (scrollView.contentOffset.y < - 100) {  
    5.           
    6.         [UIView animateWithDuration:1.0 animations:^{  
    7.               
    8.             //  frame发生偏移,距离顶部150的距离(可自行设定)  
    9.             self.tableView.contentInset = UIEdgeInsetsMake(150.0f, 0.0f, 0.0f, 0.0f);  
    10.         } completion:^(BOOL finished) {  
    11.               
    12.             /** 
    13.              *  发起网络请求,请求刷新数据 
    14.              */  
    15.   
    16.         }];  
    17.     }  
    18. }  
    19.   
    20. // 上拉加载的原理  
    21. - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate  
    22. {  
    23.       
    24.     NSLog(@"%f",scrollView.contentOffset.y);  
    25.     NSLog(@"%f",scrollView.frame.size.height);  
    26.     NSLog(@"%f",scrollView.contentSize.height);  
    27.     /** 
    28.      *  关键--> 
    29.      *  scrollView一开始并不存在偏移量,但是会设定contentSize的大小,所以contentSize.height永远都会比contentOffset.y高一个手机屏幕的 
    30.      *  高度;上拉加载的效果就是每次滑动到底部时,再往上拉的时候请求更多,那个时候产生的偏移量,就能让contentOffset.y + 手机屏幕尺寸高大于这 
    31.      *  个滚动视图的contentSize.height 
    32.      */  
    33.     if (scrollView.contentOffset.y + scrollView.frame.size.height >= scrollView.contentSize.height) {  
    34.           
    35.         NSLog(@"%d %s",__LINE__,__FUNCTION__);  
    36.         [UIView commitAnimations];  
    37.           
    38.         [UIView animateWithDuration:1.0 animations:^{  
    39.             //  frame发生的偏移量,距离底部往上提高60(可自行设定)  
    40.             self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 60, 0);  
    41.         } completion:^(BOOL finished) {  
    42.               
    43.             /** 
    44.              *  发起网络请求,请求加载更多数据 
    45.              *  然后在数据请求回来的时候,将contentInset改为(0,0,0,0) 
    46.              */  
    47.         }];  
    48.   
    49.     }  
  • 相关阅读:
    并发与高并发(七)-线程安全性-原子性-atomic
    并发与高并发(六)-并发模拟代码
    springboot跨域请求接口示例
    关于Java编码规范
    并发与高并发(五)-并发模拟的三个工具
    springboot整合redis简单示例
    关于码云如何检出项目
    关于自动化打包部署Jenkins的使用和配置
    针对Oracle的一系列操作
    关于Linux下Oracle安装后启动的问题
  • 原文地址:https://www.cnblogs.com/-ios/p/4785366.html
Copyright © 2011-2022 走看看