比如微信首页, tableView往下拉的时候,顶部会出现一个 logo。下拉刷新也是,下拉刷新时那些提示文字也是同样的效果。
在网上查了很多方法,都没有相应的解决方案。一般的说法都是说创建一张图片,并且设置为tableView的backgroundView属性,但是这样做的弊端真是无穷多,backgroundView并不会随着tableView一起滑动, 你还要自己去根据图标设置 logo的偏移。
其实相当简单,简单到你简直不敢相信自己的眼睛。
我们先来看下 tableView的层级机构。
1、tableView有一个父视图,我们来打印一下:
NSLog(@"%@",[self.tableView.superview class]);
打印结果为:
UIViewControllerWrapperView
对,没错,这就是tableView的父视图。
我第一次的做法就是将我的logo图片添加到tableView的self.tableView.superview上,确实能添加,在x-code的层级关系图上能看到,然而,很失望,屏幕上图标看不见。为什么看不见?难道被谁挡住了?
下面就是见证奇迹的时刻:
我将tableView往下滑,当我滑动一半的时候,停止滑动,手不要离开tableVIew,按住别放开,此时打开x-code的层级关系图
看层级关系图请复制链接: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的正常状态下的高度为0,然后随着tableView的滑动,该View会随着tableview的滑动而变高,其底部永远紧贴tableView的顶部.我们应该遇到过这种现象,当我们把 tablview的背景色设置为白色时,往下滑tableView,我们会发现最顶端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里添加。