- 晚上買東西,用支付寶支付時更米,看到跟新了欺栗,手癢就敲了一下。
- 效果是這樣的征峦,向上滑動時迟几,整個界面一起滑動,上面的視差效果忽略栏笆,很多demo的类腮,自己搜就好了。然后是向下滑動時蛉加,如果上半部分視圖顯示完畢就不再跟著滑動蚜枢,而是下面的tableview 在滑動了(這里有貓膩),然后拉出刷新控件针饥,還可以刷新厂抽。(當(dāng)然最好的方法是打開你的支付寶,上下滑動幾下就清楚了)
- 說完廢話上代碼(核心部分):
- 主要視圖屬性
@interface ViewController () <UIScrollViewDelegate>
// scrollView 在底部丁眼,topView筷凤、tableview是他的上下部分子視圖
@property (strong, nonatomic) UIScrollView *rootView;
@property (weak, nonatomic) UIView *topView;
@property (weak, nonatomic) Fg_tableView *tableView;
- 后面處理視差圖片做了一個調(diào)整處理(這不是重點(diǎn),后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;
//滑動太快有時候不正確卢厂,這里是保護(hù)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;
//這是根據(jù)固定的tableview 高度去計(jì)算的 rowheight
self.rowHeight = (kHeight * 5 - 310) / 20;
self.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:nil];
}
return self;
}
-(void)setContentOffsetY:(CGFloat)contentOffsetY {
// 這里就轉(zhuǎn)化成tableview 自己滑動的假象了
_contentOffsetY = contentOffsetY;
if (![self.mj_header isRefreshing]) {
self.contentOffset = CGPointMake(0, contentOffsetY);
}
}
// 這兩個是開放給外部調(diào)用刷新,刷新停止的方法
-(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];
});
}
}
- 總結(jié):處理scrollView 的滑動足淆,制造了些假象巢块,細(xì)心觀察后發(fā)現(xiàn)就是在移動scrollView 時,同時改變子視圖frame巧号,看起來像是沒動族奢,然后把偏移量給到tableview ,然后調(diào)這個方法,就轉(zhuǎn)換成tableview 在滑動了丹鸿,再在合適的偏移時調(diào)刷新控件開始刷新越走。
self.contentOffset = CGPointMake(0, contentOffsetY);
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者