iOS 仿支付寶首頁樣式(二)

ok,上一次我給大家用一種方法實現了簡單的支付寶首頁樣式。
上一篇文章:https://www.jianshu.com/p/658f2aeafa64

那篇文章裏面方法有個一弊端,就是UITableView的高度和Cell的總高度一致,也就是UITableView不能滑動,UITableViewCell的複用機制頁就不起作用了。哈哈,懶人版的支付寶首頁樣式是可以這樣完成的。

這裏就給大家講解一種新的仿支付寶樣式的方法,這種方法只是使用一個UITableView,而且不用用兩個UIScrollView嵌套,很方便而且UITableViewCell的複用機制也可以放心的使用。先上動圖(哈哈哈,雖然看上去和上一個樣式一樣,但是真的是兩種不同的代碼😂😂):


接一下是層級關係圖片:


大家可以通過層級關係明確,此時整個控制器只有一個UITableView,我們在UITableView的taleViewHeaderView上添加一個支付的視圖。

// 設置頭部視圖
    self.headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.lyf_width, kHeaderHeight)];
    // 將支付的視圖添加在頭部視圖上面
    [self.headerView addSubview:self.payView];
    
    self.tableHeaderView = self.headerView;

當UITableView滑動時,改變self.payView的Y值,就可以實現視圖漸顯的動效,此時需要注意,需要動態改變self.headerView.layer.masksToBounds,至於原因嘛,大家可以思考一下,實在想不明白就註釋一下對應代碼再看效果:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGFloat contentOffsetY = scrollView.contentOffset.y;
    if (self.contentOffsetAction) {
        self.contentOffsetAction(contentOffsetY);
    }
    
    if (contentOffsetY <= 0) {
        // 當偏移量小於0時,頭部視圖的Y值跟隨偏移量上移
        self.payView.lyf_y = contentOffsetY;
    } else {
        // 頭部視圖滾動差的效果
        self.payView.lyf_y = contentOffsetY/2;
    }
    
    self.payView.contentOffsetY = contentOffsetY;
    
    // 當contentOffsetY大於零時,打開裁剪功能。而小於零時,關閉裁剪
    // 大家如果想知道不這樣做的結果,就試着註釋一下下面的代碼試一試😜。
    self.headerView.layer.masksToBounds = contentOffsetY > 0;
}

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {
    CGFloat contentOffsetY = scrollView.contentOffset.y;
    
    if (contentOffsetY < -kHeaderHeight / 2) {
        // 當結束滑動的偏移量小於-kHeaderHeight / 2,就開始刷新tableView
        [self.mj_header beginRefreshing];
    } else if (contentOffsetY > 0 && contentOffsetY < kHeaderHeight / 2) {
        // 當偏移量大於0並且小於kHeaderHeight / 2,就把偏移量設置在CGPointMake(0, 0)
        [self setContentOffset:CGPointMake(0, 0) animated:YES];
    } else if (contentOffsetY > kHeaderHeight / 2 && contentOffsetY < kHeaderHeight) {
        // 當偏移量大於kHeaderHeight / 2並且小於kHeaderHeight,就把偏移量設置在CGPointMake(0, kHeaderHeight)
        [self setContentOffset:CGPointMake(0, kHeaderHeight) animated:YES];
    }
}

此時,除了刷新控件在UITableViewHeaderView下面顯示的效果沒有實現外,其餘的都很簡單。那麼最後就是實現這個效果了,其實也很簡單,當大家設置好刷新方法之後,動態的改變其距離頂部的高度就可以了:

__weak __typeof(self)weakSelf = self;
    // 下拉刷新
    self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
        [weakSelf loadMoreData];
    }];
    self.tableView.mj_header.ignoredScrollViewContentInsetTop = -kHeaderHeight;

大家一定注意,self.tableView.mj_header.ignoredScrollViewContentInsetTop方法需要在設定好頭部刷新控件之後再調用。
ok,代碼我會放在GitHub上面,喜歡的可以下載來看看,記得點個贊呦😏。
GitHub:https://github.com/Fdevelopmenter/LYFTestAli2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章