iOS 一个可滑动缩放的轮播图

yscroll.gif

为了做到这个效果没少走弯路,之前一直使用TableViewHeaderView来做这个,尝试了半天,结果不行。后来去看百度中一张的下拉放大怎么实现的。看到别人使用contentInsert....哎、恍然大悟!

写完后才发现,原来并不是想象的那么难嘛!下面说几个注意的点。当然,我已经封装好了。你只需要不多的代码就能搞定啦!有兴趣的朋友去我的Git去下载DEMO就行啦,喜欢给个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。改变imageViewsize

#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 11适配
以上讲解代码均在iOS 11之前版本,11之后我对其进行了重构,使用约束控制放大缩小。这里不再做讲解,感兴趣的下载上面提供的Demo自行查看即可。
iOS技术交流群:511860085 欢迎加入!

封面。

394AF221-A512-4F3F-91A7-CAE0009D001D.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 177,961评论 25 709
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,681评论 4 61
  • 聚云后端云,让移动开发更简单,让迭代更快速。 创业团队使用聚云后端云,意味着再也不用租服务器,也不用后端开发工程师...
    toldo阅读 1,454评论 0 2
  • 天边的鱼肚儿还没翻透,顾峰就已经醒来。几个小时前的酒劲儿还没有过去,他闭着眼睛翻了个身尽量让呼吸显得平稳。不出意外...
    见手青阅读 608评论 1 0
  • 他缓慢的走着 步履蹒跚 一句 回来了啊 平静的脸庞遮不住那颤抖的音嗓 忽然转身 然而还是看到了他眼角含包的泪 走吧...
    野浪花阅读 487评论 0 1

友情链接更多精彩内容