比如微信首頁, tableView往下拉的時候,頂部會出現(xiàn)一個 logo。下拉刷新也是,下拉刷新時那些提示文字也是同樣的效果。
在網(wǎng)上查了很多方法,都沒有相應的解決方案。一般的說法都是說創(chuàng)建一張圖片,并且設置為tableView的backgroundView屬性,但是這樣做的弊端真是無窮多,backgroundView并不會隨著tableView一起滑動, 你還要自己去根據(jù)圖標設置 logo的偏移。
其實相當簡單,簡單到你簡直不敢相信自己的眼睛。
我們先來看下 tableView的層級機構(gòu)。
1、tableView有一個父視圖,我們來打印一下:
NSLog(@"%@",[self.tableView.superview class]);
打印結(jié)果為:
UIViewControllerWrapperView
對,沒錯,這就是tableView的父視圖。
我第一次的做法就是將我的logo圖片添加到tableView的self.tableView.superview上,確實能添加,在x-code的層級關(guān)系圖上能看到,然而,很失望,屏幕上圖標看不見。為什么看不見?難道被誰擋住了?
下面就是見證奇跡的時刻:
我將tableView往下滑,當我滑動一半的時候,停止滑動,手不要離開tableVIew,按住別放開,此時打開x-code的層級關(guān)系圖
看層級關(guān)系圖請復制鏈接:http://upload-images.jianshu.io/upload_images/3006981-05e16a976dbb19cf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240
看到那張灰白色的,讓我們見證奇跡的View了嗎?它就是我們需要的,它是tableVIew的第一個子視圖。而且這個View具有彈簧效果,他的高度會隨著tableView的下滑而增加,并且底部緊貼 tableView的頂部。
下面是核心代碼(你需要的就是它):
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
// taleview的子視圖中,有一張彈簧似的View,這張view在tableView的正常狀態(tài)下的高度為0,然后隨著tableView的滑動,該View會隨著tableview的滑動而變高,其底部永遠緊貼tableView的頂部.我們應該遇到過這種現(xiàn)象,當我們把 tablview的背景色設置為白色時,往下滑tableView,我們會發(fā)現(xiàn)最頂端tableView的背景色為灰白色,這灰白色的View就是這張具有彈簧效果的view
UIView *springview = self.tableView.subviews.firstObject;
[springview insertSubview:self.topLogoImageView atIndex:0];
[self.topLogoImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(CGSizeMake(40, 40));
make.centerX.mas_equalTo(_topLogoImageView.superview);
// 必須設置底部約束
make.bottom.mas_equalTo(_topLogoImageView.superview).offset(-36);
}];
}
// 懶加載,
- (UIImageView *)topLogoImageView {
if (!_topLogoImageView) {
_topLogoImageView = [[UIImageView alloc] init];
_topLogoImageView.image = [UIImage imageNamed:@"login_logo"];
_topLogoImageView.contentMode = UIViewContentModeScaleAspectFit;
_topLogoImageView.backgroundColor = SPTableViewBackgroundColor;
}
return _topLogoImageView;
}
最后附上幾個注意的地方:
1、我這里用的是 masonry約束布局,不管你用的是什么布局,topLogoImageView的底部必須固定好。比如你用普通frame布局,那么y值應該是
2、添加_topLogoImageView的時候用 insertSubview: atIndex:,不要用addSubView:
3、一定要保證要保證tableView的頂點是從導航欄的左下角開始,而不是左上角。比如:導航欄的屬性translucent設置為NO(iOS7或 iOS7以上默認為NO )
4、添加_topLogoImageView最好在- (void)viewDidAppear:(BOOL)animated里添加。