iOS支付宝首页8.11跟新demo

  • 晚上买东西,用支付宝支付时,看到跟新了,手痒就敲了一下。
  • 效果是这样的,向上滑动时,整个界面一起滑动,上面的视差效果忽略,很多demo的,自己搜就好了。然后是向下滑动时,如果上半部分视图显示完毕就不再跟着滑动,而是下面的tableview 在滑动了(这里有猫腻),然后拉出刷新控件,还可以刷新。(当然最好的方法是打开你的支付宝,上下滑动几下就清楚了)
  • 说完废话上代码(核心部分):
  • 主要视图属性
@interface ViewController () <UIScrollViewDelegate>
// scrollView 在底部,topView、tableview是他的上下部分子视图
@property (strong, nonatomic) UIScrollView *rootView;
@property (weak, nonatomic) UIView *topView;
@property (weak, nonatomic) Fg_tableView *tableView;
  • 后面处理视差图片做了一个调整处理(这不是重点,后6行代码可以不看)
@implementation ViewController
-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
        CGFloat y = scrollView.contentOffset.y;
    if (y <= 0) {
        //这是上半部分视图显示完毕后,下拉处理,伴随scrollView移动,看起来像是没动
        CGRect newFrame = self.topView.frame;
        newFrame.origin.y = y;
        self.topView.frame = newFrame;
        
        newFrame = self.tableView.frame;
        newFrame.origin.y = y + 310;
        self.tableView.frame = newFrame;
        
        //偏移量给到tableview,tableview自己来滑动
        self.tableView.contentOffsetY = y;
        
        //滑动太快有时候不正确,这里是保护imageView 的frame为正确的。
        newFrame = self.imageView.frame;
        newFrame.origin.y = 0;
        self.imageView.frame = newFrame;
    } else {
        //视差处理
        CGRect newFrame = self.imageView.frame;
        newFrame.origin.y = y/2;
        self.imageView.frame = newFrame;
    }
}
  • 然后是tableview 接收到来自scrollView 的偏移量的处理
-(instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style {
    
    self = [super initWithFrame:frame style:style];
    
    if (self) {
        self.dataSource = self;
        self.delegate = self;
        //这是根据固定的tableview 高度去计算的 rowheight
        self.rowHeight = (kHeight * 5 - 310) / 20;
        self.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:nil];
    }
    return self;
}

-(void)setContentOffsetY:(CGFloat)contentOffsetY {
    // 这里就转化成tableview 自己滑动的假象了
    _contentOffsetY = contentOffsetY;
    if (![self.mj_header isRefreshing]) {
        
        self.contentOffset = CGPointMake(0, contentOffsetY);
    }
}

// 这两个是开放给外部调用刷新,刷新停止的方法
-(void)startRefreshing {
    [self.mj_header beginRefreshing];
}
-(void)endRefreshing {
    [self.mj_header endRefreshing];
}
  • 在这里判断何时刷新
@implementation ViewController
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    
    // 松手时判断是否刷新
    CGFloat y = scrollView.contentOffset.y;
    if (y < - 65) {
        [self.tableView startRefreshing];
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [self.tableView endRefreshing];
        });
    }
}
  • 总结:处理scrollView 的滑动,制造了些假象,细心观察后发现就是在移动scrollView 时,同时改变子视图frame,看起来像是没动,然后把偏移量给到tableview ,然后调这个方法,就转换成tableview 在滑动了,再在合适的偏移时调刷新控件开始刷新。
self.contentOffset = CGPointMake(0, contentOffsetY);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,487评论 4 61
  • 大家知道分子美食怎么做吗?中国分子美食培训也只有王森学校有哦~下面王森学校就给大家介绍下分子美食吧! 蛋黄悬浮于明...
    糊花火阅读 1,774评论 1 0
  • 今天看了下日历,从两只小巴西到家算起已经半个月了。然而天气不好,气温忽高忽低,一直达不到它们正常进食和活动的条件。...
    羽人非獍阅读 1,243评论 0 0
  • 我在地图上标记了影片中出现的几个重要的地点。从西藏西南部芒康出发,到达拉萨,最后深入阿里地区到达神山冈仁...
    南宫旖萱阅读 3,465评论 0 0

友情链接更多精彩内容