UITableView 繼承自UIScrollView,如果要實現這種效果,無非是監聽下拉動作,改變頭部視圖frame.
在這里用到UIScrollView的兩個代理方法:
- (void)scrollViewDidScroll:(UIScrollView*)scrollView;//滑動即會調用(改變頭部視圖的frame)
- (void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView;//滑動結束時調用(恢復頭部視圖原始frame)
//這兩個代理方法實現:
- (void)scrollViewDidScroll:(UIScrollView*)scrollView{
CGFloatyOffset =self.tableView.contentOffset.y;
if(yOffset<0)
{
CGFloatheight =ABS(yOffset)+HeaderViewHeight;
self.topViewCell.frame=CGRectMake(0,yOffset,DEVICE_WIDTH, height);
}
}
- (void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView
{
[UIViewanimateWithDuration:0.2animations:^{
CGRectframe =self.topViewCell.frame;
frame.size.height=HeaderViewHeight;
self.topViewCell.frame= frame;
}];
}
這里拿一個相對簡單的例子說一下:
就這樣一個界面,來說一下實現過程,其中的數據都是些死數據,只為了舉例。
這里只重點說一下放大頭部視圖效果代碼,因為其他只是常規的分section的tableView。
首先,將這個整體作為頭部視圖,
為了使用簡單,將該視圖進行封裝,創建一個類LRHMeTopView,使用xib進行創建,提供一個類方法+(instancetype)loadTopView,用于返回視圖。
+(instancetype)loadTopView
{
return[[[NSBundlemainBundle]loadNibNamed:@"LRHMeTopView"owner:selfoptions:nil]lastObject];
}
然后創建cell--LRHMeTopViewCell,將該視圖作為cell的內容視圖,
主要代碼:
//將視圖添加到cell中
- (void)awakeFromNib {
[superawakeFromNib];
self.backView= [LRHMeTopViewloadTopView];
[self.contentViewaddSubview:self.backView];
[self.backViewmas_makeConstraints:^(MASConstraintMaker*make) {
make.edges.equalTo(self.contentView);
}];
//類方法獲取cell對象
}
+(instancetype)loadCell
{
return[[[NSBundlemainBundle]loadNibNamed:@"LRHMeTopViewCell"owner:selfoptions:nil]lastObject];
}
接下來就是tableView的實現了。
代理方法的實現:
完整代碼已放到github,不對的地方,還請指正,如果喜歡希望能給個星哦!