项目介绍:
为了做到这个效果没少走弯路,之前一直使用TableViewHeaderView来做这个,尝试了半天,结果不行。后来去看百度中一张的下拉放大怎么实现的。看到别人使用contentInset….哎、恍然大悟!
写完后才发现,原来并不是想象的那么难嘛!下面说几个注意的点。当然,我已经封装好了。你只需要不多的代码就能搞定啦!有兴趣的朋友去我的GitHub下载地址就行啦,喜欢给个Star~
首先,想要下拉缩放上面的轮播图,你得把滑动的Offset传给轮播图。
//告诉dragView表格滑动了
CGFloat offset = scrollView.contentOffset.y + kHeaderHeight;
[self.dragView dragViewWithOffset:offset];
我们进入这个方法看下做了怎么样的处理
#pragma mark -- 滚动偏移量
- (void)dragViewWithOffset:(CGFloat)offset {
if (offset < 0) {
NSDictionary *dic = @{@"offset" : [NSString stringWithFormat:@"%f",offset]};
[[NSNotificationCenter defaultCenter] postNotificationName:@"changeSize" object:nil userInfo:dic];
//更新layout
CGSize size = self.layout.itemSize;
size.height = self.initHeight - offset ;
self.layout.itemSize = size;
//更新self
self.height = self.initHeight;
self.y = 0;
self.height = self.initHeight - offset;
}else {
self.y = 0;
CGFloat minOffset = self.height;
self.y = minOffset > offset ? - offset : - minOffset;
}
self.collectionView.height = self.height;
self.pageControl.y = self.height - kPageControH;
}
根据偏移量修改轮播图的height。当偏移量<0的时候,也就是向上拖表格,这时候轮播图的Cell大小不再合适当前视图。发个消息告诉cell。改变imageView的size
#pragma mark -- set methed
- (void)setImageURL:(NSString *)imageURL {
NSURL *dataUrl = [NSURL URLWithString:imageURL];
[self.imageView sd_setImageWithURL:dataUrl placeholderImage:[UIImage imageNamed:@"pageOther.png"]];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(zoomScale:) name:@"changeSize" object:nil];
}
- (void)zoomScale:(NSNotification *)notification {
NSDictionary *dic = notification.userInfo;
CGFloat offset = [dic[@"offset"] floatValue];
self.imageView.size = CGSizeMake(self.width, self.height - offset);
}
在设置图片URL的时候,正好为每个cell都注册一个通知。接到这个通知修改size。这样就做到了。轮播图和cell内容都是一样大小的了。
至于轮播图的实现我就不多说了。
另外,我加入了定时器,自动滚动,为了方便解决循环引用我使用了HWWeakTimer三方。代码很少,但是效果不错也很方便。
关于导航栏和状态栏的动态显示问题,原本我自己写了一套,是放在轮播图中的,但是我觉得放进去不好,耦合性差,如果有人不想改,也许就得修改我的代码了。因此我拆到外面了,修改为使用GKFadeNavigationController这个三方。你只需要继承他的导航控制器,再写一些代码就行了。(我的Demo就是在故事版中继承了这个控制器)
iOS技术交流群:511860085 欢迎加入!