iOS scrollview循环播放加缩放

  前些日子一直在研究3d的框架没有时间写博客,不过最后需求改了,也没研究出个啥。这段时间出了新的需求,需要循环播放图片,并且滑动的时候中间的图片有缩放的效果。刚开始想在网上搜索,不过并没有找到合适的demo,没办法只能写个了。

  首先说下思路,做这个效果需要解决三个问题。

  第一个问题,如何控制每次滑动的距离。iOS中好像并没有设置scrollview每次滑动的距离吧。设置其画框的大小和pageenable的时候已经决定了其每次滑动的距离。但是需求要显示三张图片啊,中间大图,两边的图片只显示一部分。也是想了个恶心的办法,将画框的大小设置成图片的宽度?一个图片之间的距离(这个距离可根据实际情况调整),将masktobounds设置为no,即可。不过这样做有一个缺点,左右两边的图片是不能响应滑动事件的,以后有时间再解决这个问题吧。

  第二个问题,循环播放,这个估计都会,不解释了,可以看代码。

  第三个问题,也是难点,如何在滑动的时候改变图片的大小。我们可以根据图片在scrollview上的位置得到其centerx,然后根据其与contentoffset.x+width/2.0(图片的宽度一半)+gap/2.0(图片间距的一半)之间的差作为x,构建一次线性方程式,其实很简单,看看代码就懂了。最后设置transform。

  可能说的不清楚,直接上代码吧。

  1 //图片的个数
  2 #define ARRAYCOUNT 3
  3 //缩放的比例
  4 #define SCALE 0.369565
  5 #import "ALNewKeeperScrollView.h"
  6 #import "ALNewKeeperModelView.h"
  7
  8 @interface ALNewKeeperScrollView ()<UIScrollViewDelegate>
  9 {
 10     float rate;
 11     float gap;
 12     float whRate;
 13     float width ;
 14     float height;
 15     BOOL ifFirstScroll;
 16 }
 17 @property (nonatomic, strong) UIScrollView *scrollView;
 18 @end
 19
 20 @implementation ALNewKeeperScrollView
 21
 22 - (instancetype)initWithFrame:(CGRect)frame
 23 {
 24     if (self = [super initWithFrame:frame])
 25     {
 26         [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(setClipsToBoundsYes) name:@"setClipsToBoundsYes" object:nil];
 27         [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(setClipsToBoundsNo) name:@"setClipsToBoundsNo" object:nil];
 28         rate = 640/SCREEN_WIDTH;
 29         gap = (28*4)/rate;
 30         whRate = (float)630/470;
 31         height = 460/rate;
 32         width = height/whRate;
 33
 34         self.scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, width+gap, self.height)];
 35 //        self.scrollView.backgroundColor = [UIColor cyanColor];
 36         self.scrollView.centerX = self.width*0.5;
 37         self.scrollView.showsVerticalScrollIndicator = NO;
 38         self.scrollView.showsHorizontalScrollIndicator = NO;
 39         self.scrollView.scrollsToTop = NO;
 40         self.scrollView.delegate = self;
 41         self.scrollView.clipsToBounds = NO;
 42         [self addSubview:self.scrollView];
 43
 44         ifFirstScroll = YES;
 45     }
 46     return self;
 47 }
 48 - (void)setClipsToBoundsYes
 49 {
 50     self.scrollView.clipsToBounds = YES;
 51 }
 52 - (void)setClipsToBoundsNo
 53 {
 54     self.scrollView.clipsToBounds = NO;
 55 }
 56 - (void)config:(NSArray *)array andOffSet:(NSInteger)index
 57 {
 58     int arrayCount = ARRAYCOUNT;
 59     int count = arrayCount+4;
 60     for (int i=0; i<count; i++)
 61     {
 62         //3 4 0 1 2 3 4 0 1
 63         ALNewKeeperModelView *view = [[ALNewKeeperModelView alloc] initWithFrame:CGRectMake(gap/2.0 + i*(width+gap), 122/rate, width, height)];
 64         view.centerY = self.height * 0.5;
 65         if (i<2)
 66         {
 67             [view config:[NSString stringWithFormat:@"%i", i+3]];
 68         }
 69         else if (i<count-2)
 70         {
 71             [view config:[NSString stringWithFormat:@"%i", i-2]];
 72         }
 73         else
 74         {
 75             [view config:[NSString stringWithFormat:@"%i", i-(count-2)]];
 76         }
 77         [self.scrollView addSubview:view];
 78     }
 79     self.scrollView.pagingEnabled = YES;
 80 //    self.scrollView.bounces = NO;
 81     [self.scrollView setContentSize:CGSizeMake(count*(gap+width)+gap, 0)];
 82     float offsetx = (index+2)*(width+gap);
 83     [self.scrollView setContentOffset:CGPointMake(offsetx, 0)];
 84 }
 85
 86 - (void)scrollViewDidScroll:(UIScrollView *)scrollView
 87 {
 88     CGFloat startX = width+gap;
 89     CGFloat endX = (ARRAYCOUNT + 2)*(width+gap);
 90     CGFloat offsetX = scrollView.contentOffset.x;
 91     if ((NSInteger)offsetX <= (NSInteger)startX )
 92     {
 93         [scrollView setContentOffset:CGPointMake(endX-startX, 0)];
 94     }
 95     if ((NSInteger)offsetX >= (NSInteger)endX)
 96     {
 97         [scrollView setContentOffset:CGPointMake(startX+startX, 0)];
 98     }
 99     //滑动的时候缩放图片大小
100     float contentOffsetX = scrollView.contentOffset.x;
101     float centerX = contentOffsetX+gap/2.0+width/2.0;
102     for (id view in [scrollView subviews])
103     {
104         if ([view isKindOfClass:[ALNewKeeperModelView class]])
105         {
106             ALNewKeeperModelView *modelView = (ALNewKeeperModelView *)view;
107             float x = modelView.centerX-centerX;
108             float scale = 1.0;
109             if (x >= 0 && x <= width)
110             {
111                 scale += -SCALE/width*x+SCALE;
112             }
113             else if (x < 0 && x > - width)
114             {
115                 scale += SCALE/width*x+SCALE;
116             }
117             NSLog(@"%f", scale);
118             [self setShadow:modelView andScale:scale];
119             modelView.transform = CGAffineTransformMakeScale(scale, scale);
120         }
121     }
122 }
123
124 - (void)setShadow:(UIView *)view andScale:(float)scale
125 {
126     view.layer.shadowColor = [UIColor blackColor].CGColor;
127     view.layer.shadowOffset = CGSizeMake(4, 4);
128     view.layer.shadowRadius = 5;
129     view.layer.shadowOpacity = (float)(scale-1.0)*2;
130 }
131
132 @end

  上述是主要的类,还有几个类就不用写了。可以将该类中没有的类自定义一个view进行替换。

时间: 2024-10-14 17:24:11

iOS scrollview循环播放加缩放的相关文章

React Native scrollview 循环播放

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #008400 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; line-height: 18.0px; font: 12.0px Menlo; color: #d4d4d4; min-height: 14.0px } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px He

iOS - 视频循环播放

录制完视频后,我们想在录制视频的预览层上无限循环播放我们的小视频,是不是很炫酷,这时候我们就有三中选择了:1.MPMoviePlayerController2.AVPlayer3.AVAssetReader+AVAssetReaderTrackOutput 但是我们这个预览层是自定义的喔,所以MPMoviePlayerController只能马上给筛选掉了,所以用,那么我们就要用到 AVPlayer 了,虽然上 AVPlayer 最多只能创建16个,性能上不及用 AVAssetReader+AV

iOS 自动循环播放广告控件实现

1.原理:图片:图片集合名称保存成array: 轮播:为了实现滑动效果,至少需要三个imageview,为了确保左右滑动,需要一直显示中间的view 每次滑动后都需要重新加载三个view的图片.并设置当前图片下标 2.接口:提供给viewcontroller一个判断左右滑动的接口,并实现滑动效果 提供给pagecontroller一个设置页面的接口,根据下标设置当前现实页 3.代码:ADScrollView,附详细注释 .h @interface ADScrollView : UIScrollV

scrollView循环播放器(一)

/** *  设置scrollView */ - (void)setUpScrollView:(NSArray *)array { UIScrollView *scrollView = [[UIScrollView alloc]initWithFrame:self.bounds]; scrollView.delegate = self; scrollView.pagingEnabled = YES; scrollView.showsHorizontalScrollIndicator = NO;

[ios]scrollView实现移动与缩放

实现滑动 1.在viewDidLoad中对scrollview的contentSize属性赋值 告诉他滑动范围. 实现缩放 1.在storyboard的scrollview的attribute标签中设置zoom的范围. 2.实现一个UIScrollViewDelegate[scrollview的委托],并将其在viewDidLoad中传给scrollview 3.实现UIScrollViewDelegate 需要复写- (UIView *)viewForZoomingInScrollView:(

深入理解IOS布局和view加载显示

前言 一个控件从外在特征来说,主要是封装这几点: 交互方式 显示样式 数据使用 对外在特征的封装,能让我们在多种环境下达到 PM 对产品的要求,并且提到代码复用率,使维护工作保持在一个相对较小的范围内:而一个好的控件除了有对外一致的体验之外,还有其内在特征: 灵活性 低耦合 易拓展 易维护 通常特征之间需要做一些取舍,比如灵活性与耦合度,有时候接口越多越能适应各种环境,但是接口越少对外产生的依赖就越少,维护起来也更容易.通常一些前期看起来还不错的代码,往往也会随着时间加深慢慢“成长”,功能的增加

iOS开发–音频播放、录音、视频播放、拍照、视频录制

概览 随着移动互联网的发展,如今的手机早已不是打电话.发短信那么简单了,播放音乐.视频.录音.拍照等都是很常用的功能.在iOS中对于多媒体的支持是非常强大的,无论是音视频播放.录制,还是对麦克风.摄像头的操作都提供了多套API.在今天的文章中将会对这些内容进行一一介绍: 音频 在iOS中音频播放从形式上可以分为音效播放和音乐播放.前者主要指的是一些短音频播放,通常作为点缀音频,对于这类音频不需要进行进度.循环等控制.后者指的是一些较长的音频,通常是主音频,对于这些音频的播放通常需要进行精确的控制

封装scrollView 循环滚动,tableViewCell(连载) mvc

封装 封装 封装 ... 封装的重要性太重要了 给大家在送点干货 从一个项目中抽取出来的,和大家一起分享 封装scrollView 循环滚动,tableViewCell(连载) 明天还会更新 tableView 的封装 使用了mvc 设计模式 代码如下: // // GPMainController.m #import "GPMainController.h" #import "GPAdsView.h" #import "GPSubViewCell.h&q

ios 视频音乐播放

IOS开发小技巧(视频和音乐播放)1.IOS视频播放代码(添加MediaPlayer.framework和#import) -(void)playMovie:(NSString *)fileName{ //视频文件路径 NSString *path = [[NSBundle mainBundle] pathForResource:fileName ofType:@"mp4"]; //视频URL NSURL *url = [NSURL fileURLWithPath:path]; //视