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

yscroll.gif

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

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

封面。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏哈雷彗星撞地球

iOS 知识小集(Status Bar变换)

iOS 中经常会有需要在某个界面改变状态栏颜色或者某个界面隐藏状态栏的需求。而改变状态栏颜色和控制状态栏显示和隐藏的API,在iOS 的不同版本中也发生了很多变...

8720
来自专栏地方网络工作室的专栏

FireFox 火狐浏览器57以上版本linux下隐藏标题栏方法插件

FireFox 火狐浏览器57以上版本linux下隐藏标题栏方法插件 不知道火狐的开发团队咋想的,在 linux 下面始终有一个非常难看并且毫无用处的标题栏。当...

30490
来自专栏理论坞

那些你不知道的Photoshop冷知识⑤——CC2015评测专题

笔者在探索新版本时,首先注意的便是首选项的变化,可以发现这次更新之后首选项侧边栏多了不少东西,点进去之后才发现原来是进行了重新分类,那么有哪些好玩的功能呢?介绍...

11740
来自专栏Google Dart

AngularDart Material Design 卡片 顶

材料卡是由Google材料团队(也称为mdc-web)提供的卡片样式。 这是一个允许在AngularDart应用程序中使用样式的包装器。 有关如何使用这些样式的...

16740
来自专栏Material Design组件

Human Interface Guidelines —— Buttons

16160
来自专栏javascript趣味编程

2 HTML5基础

答:借助HTML5解决和分析工业设计中的问题,易于实现数据可视化,而且支持所有主流操作系统。与传统C/C++/FORTRON计算机语言相比具备几个显著优势:首先...

24100
来自专栏Python自动化测试

自动化测试中对js的处理

在自动化测试中,某些问题无法解决,我们可以执行javascript代码通过seleniumwebdriver的使用方法来解决我们遇到的问题,如浏览器显示的内容...

25160
来自专栏Golang语言社区

nwui —— 又一个go语言图形界面解决方案

Github: https://github.com/go-nwui/nwui 最近开的一个大坑,具体实现就是自动生成htm+css+js然后调用nw.js来显...

40860
来自专栏Rindew的iOS技术分享

Swift 无限轮播YLCycleViewYLMenuViewYLSinglerowView

22990
来自专栏编程微刊

小程序点击轮播图跳转到tab导航界面

一切准备好之后,在wxml文件里面,我们要使用 bindtap在图片上绑定一个事件,在js里面写事件函数的具体操作。

33520

扫码关注云+社区

领取腾讯云代金券