1.通過(guò)xib做
我們經(jīng)常需要讓tableview上的headview可以通過(guò)下拉tableview進(jìn)行縮放横漏,達(dá)到一種彈動(dòng)的效果各吨。
首先我們需要一個(gè)headview粗梭,這個(gè)headview需要使用AutoLayout迁沫,或者說(shuō)你用Masonry也行苇倡。
下面用的是xib的方法,我還沒(méi)嘗試用過(guò)Masonry审姓,不過(guò)既然都是約束珍特,肯定也都能實(shí)現(xiàn)的。
你需要把一個(gè)imageview的高度延伸到view的頂上魔吐,然后向下拖一個(gè)與headview頂部的約束扎筒,比如說(shuō)這樣:
然后在tableview里:
self.tableHeaderView = xxx
這里的xxx也就是說(shuō)跟xib關(guān)聯(lián)的view。
然后你需要實(shí)現(xiàn)一個(gè)方法:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGFloat offset = scrollView.contentOffset.y;
}
這個(gè)方法是scrollview里的酬姆,tableview實(shí)際上就是繼承了scrollview嗜桌。而這個(gè)offset是scrollview的偏移量,也就是說(shuō)辞色,你要做的就是通過(guò)這個(gè)offset的偏移量骨宠,以一種比例來(lái)拉伸headview上的imageview。
注意相满,這里根據(jù)offset改變控件的frame一定要是改變imageview的frame层亿,如果你改變的是headview的frame,就會(huì)出現(xiàn)headview拉伸的過(guò)程中覆蓋了底下的cell立美,這樣是不對(duì)的匿又。因?yàn)閔eadview下的cell應(yīng)該是在拉伸的過(guò)程中就往下或者往上滑動(dòng)的。
2.通過(guò)純代碼做
通過(guò)純代碼做有一點(diǎn)小技巧
我們首先需要?jiǎng)?chuàng)建一個(gè)imageView放在vc的view上悯辙,這個(gè)originFrame之后要用
imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"背景"]];
imageView.frame = CGRectMake(0, 64,[UIScreen mainScreen].bounds.size.width, 200);
originFrame = imageView.frame;
[self.view addSubview:imageView];
然后在把tableView放在vc的view上琳省,然后把tableView的背景設(shè)為clearColor
UITableView *tableview = [[UITableView alloc]initWithFrame:CGRectMake(0, 64, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height-64)];
tableview.delegate = self;
tableview.dataSource = self;
tableview.showsVerticalScrollIndicator = false;
tableview.backgroundColor = [UIColor clearColor];
[self.view addSubview:tableview];
然后效果應(yīng)該是這樣的
接下來(lái)要讓tableView不能蓋住那個(gè)imageView迎吵,做法是
UIView *headerView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 200)];
headerView.backgroundColor = [UIColor clearColor];
tableview.tableHeaderView = headerView;
我這個(gè)imageView的高度是200,所以我給了個(gè)tableHeaderView設(shè)為clearColor
效果是這樣的
那拖動(dòng)拉伸效果是寫在scrollViewDidScroll里的
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
CGFloat offset = scrollView.contentOffset.y;
if (offset > 0) {
//復(fù)合語(yǔ)句
imageView.frame = ({
CGRect frame = originFrame;
frame.origin.y = originFrame.origin.y - offset;
frame;
});
}else {
imageView.frame = ({
CGRect frame = originFrame;
frame.size.height = originFrame.size.height - offset;
frame.size.width = originFrame.size.width - offset;
frame.origin.x = originFrame.origin.x - (frame.size.width - originFrame.size.width) / 2;
frame;
});
}
}
originFrame在這里用到了针贬,因?yàn)閕mageView的frame時(shí)刻在變击费,所以要用一個(gè)初始值originFrame
最終效果