前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS 一个可滑动缩放的轮播图

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

作者头像
Raindew
发布2018-06-14 14:32:45
1.5K0
发布2018-06-14 14:32:45
举报

yscroll.gif

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

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

首先,想要下拉缩放上面的轮播图,你得把滑动的Offset传给轮播图。

代码语言:javascript
复制
 //告诉dragView表格滑动了
    CGFloat offset = scrollView.contentOffset.y + kHeaderHeight;
    [self.dragView dragViewWithOffset:offset];

我们进入这个方法看下做了怎么样的处理

代码语言:javascript
复制
#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

代码语言:javascript
复制
#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 欢迎加入!

封面。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.05.27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 封面。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档