在项目中,常常用到轮播图,我们常常会想到用UIScrollView来实现。但是还有很多较高大上的方法,效果也更加炫酷。比如下面将要说的碎片化轮播。

效果类似现实中广告牌的翻转效果,如图

        

实际上是两层view在交替显示,所以先要一个TranformFadeView类,实现翻转的翻转碎片化的效果,翻转时间,碎片宽度的等..

TranformFadeView.h

#import <UIKit/UIKit.h>@interface TranformFadeView : UIView/***  Image显示方式*/
@property (nonatomic) UIViewContentMode  contentMode;/***  要显示的相片*/
@property (nonatomic, strong) UIImage   *image;/***  垂直方向方块的个数*/
@property (nonatomic) NSInteger          verticalCount;/***  水平的个数*/
@property (nonatomic) NSInteger          horizontalCount;/***  开始构造出作为mask用的view*/
- (void)buildMaskView;/***  渐变动画的时间*/
@property (nonatomic) NSTimeInterval     fadeDuradtion;/***  两个动画之间的时间间隔*/
@property (nonatomic) NSTimeInterval     animationGapDuration;/***  开始隐藏动画**  @param animated 是否执行动画*/
- (void)fadeAnimated:(BOOL)animated;/***  开始显示动画**  @param animated 时候执行动画*/
- (void)showAnimated:(BOOL)animated;@end

TranformFadeView.m

#import "TranformFadeView.h"typedef enum : NSUInteger {kSubViewTag = 0x1000,} ETranformFadeViewValue;@interface TranformFadeView ()/***  图片*/
@property (nonatomic, strong) UIImageView    *imageView;/***  所有的maskView*/
@property (nonatomic, strong) UIView         *allMaskView;/***  maskView的个数*/
@property (nonatomic)         NSInteger       maskViewCount;/***  存储maskView的编号*/
@property (nonatomic, strong) NSMutableArray *countArray;@end@implementation TranformFadeView/***  初始化并添加图片**  @param frame frame值*/
- (void)initImageViewWithFrame:(CGRect)frame {self.imageView                     = [[UIImageView alloc] initWithFrame:frame];self.imageView.layer.masksToBounds = YES;[self addSubview:self.imageView];
}- (instancetype)initWithFrame:(CGRect)frame {if (self = [super initWithFrame:frame]) {[self initImageViewWithFrame:self.bounds];}return self;
}- (void)buildMaskView {// 如果没有,就返回空if (self.horizontalCount < 1 || self.verticalCount < 1) {return;}// 承载所有的maskViewself.allMaskView = [[UIView alloc] initWithFrame:self.bounds];self.maskView    = self.allMaskView;// 计算出每个view的尺寸CGFloat height         = self.frame.size.height;CGFloat width          = self.frame.size.width;CGFloat maskViewHeight = self.verticalCount   <= 1 ? height : (height / self.verticalCount);CGFloat maskViewWidth  = self.horizontalCount <= 1 ? width  : (width  / self.horizontalCount);// 用以计数int count = 0;// 先水平循环,再垂直循环for (int horizontal = 0; horizontal < self.horizontalCount; horizontal++) {for (int vertical = 0; vertical < self.verticalCount; vertical++) {CGRect frame = CGRectMake(maskViewWidth  * horizontal,maskViewHeight * vertical,maskViewWidth,maskViewHeight);UIView *maskView         = [[UIView alloc] initWithFrame:frame];maskView.frame           = frame;maskView.tag             = kSubViewTag + count;maskView.backgroundColor = [UIColor blackColor];[self.allMaskView addSubview:maskView];count++;}}self.maskViewCount = count;// 存储self.countArray  = [NSMutableArray array];for (int i = 0; i < self.maskViewCount; i++) {[self.countArray addObject:@(i)];}
}/***  策略模式一**  @param inputNumber 输入**  @return 输出*/
- (NSInteger)strategyNormal:(NSInteger)inputNumber {NSNumber *number = self.countArray[inputNumber];return number.integerValue;
}- (void)fadeAnimated:(BOOL)animated {if (animated == YES) {for (int i = 0; i < self.maskViewCount; i++) {UIView *tmpView = [self maskViewWithTag:[self strategyNormal:i]];[UIView animateWithDuration:(self.fadeDuradtion <= 0.f ? 1.f : self.fadeDuradtion)delay:i * (self.animationGapDuration <= 0.f ? 0.2f : self.animationGapDuration)options:UIViewAnimationOptionCurveLinearanimations:^{tmpView.alpha = 0.f;} completion:^(BOOL finished) {}];}} else {for (int i = 0; i < self.maskViewCount; i++) {UIView *tmpView = [self maskViewWithTag:i];tmpView.alpha   = 0.f;}}
}- (void)showAnimated:(BOOL)animated {if (animated == YES) {for (int i = 0; i < self.maskViewCount; i++) {UIView *tmpView = [self maskViewWithTag:[self strategyNormal:i]];[UIView animateWithDuration:(self.fadeDuradtion <= 0.f ? 1.f : self.fadeDuradtion)delay:i * (self.animationGapDuration <= 0.f ? 0.2f : self.animationGapDuration)options:UIViewAnimationOptionCurveLinearanimations:^{tmpView.alpha = 1.f;} completion:^(BOOL finished) {}];}} else {for (int i = 0; i < self.maskViewCount; i++) {UIView *tmpView = [self maskViewWithTag:i];tmpView.alpha   = 1.f;}}
}/***  根据tag值获取maskView**  @param tag maskView的tag值**  @return tag值对应的maskView*/
- (UIView *)maskViewWithTag:(NSInteger)tag {return [self.maskView viewWithTag:tag + kSubViewTag];
}#pragma mark - setter & getter.@synthesize contentMode = _contentMode;- (void)setContentMode:(UIViewContentMode)contentMode {_contentMode               = contentMode;self.imageView.contentMode = contentMode;
}- (UIViewContentMode)contentMode {return _contentMode;
}@synthesize image = _image;- (void)setImage:(UIImage *)image {_image               = image;self.imageView.image = image;
}- (UIImage *)image {return _image;
}@end

控制其中,用定时器设定5张图片的交替轮播,采用两层TranformFadeView

#import "ViewController.h"
#import "TranformFadeView.h"typedef enum : NSUInteger {kTypeOne,kTypeTwo,} EType;
@interface ViewController ()@property (weak, nonatomic) IBOutlet UIView *contentView;
@property (nonatomic, strong) TranformFadeView *tranformFadeViewOne;
@property (nonatomic, strong) TranformFadeView *tranformFadeViewTwo;
@property (nonatomic,strong)NSTimer *timer;
@property (nonatomic)         EType     type;@property (nonatomic, strong) NSArray   *images;
@property (nonatomic)         NSInteger  count;
@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];self.images = @[[UIImage imageNamed:@"banner5"],[UIImage imageNamed:@"banner1"],[UIImage imageNamed:@"banner2"],[UIImage imageNamed:@"banner3"],[UIImage imageNamed:@"banner4"]];// 图片1self.tranformFadeViewOne                      = [[TranformFadeView alloc] initWithFrame:self.contentView.bounds];self.tranformFadeViewOne.contentMode          = UIViewContentModeScaleAspectFill;self.tranformFadeViewOne.image                = [self currentImage];self.tranformFadeViewOne.verticalCount        = 3;self.tranformFadeViewOne.horizontalCount      = 20;self.tranformFadeViewOne.center               = self.contentView.center;self.tranformFadeViewOne.fadeDuradtion        = 1.f;self.tranformFadeViewOne.animationGapDuration = 0.075f;[self.tranformFadeViewOne buildMaskView];[self.contentView addSubview:self.tranformFadeViewOne];// 图片2self.tranformFadeViewTwo                      = [[TranformFadeView alloc] initWithFrame:self.contentView.bounds];self.tranformFadeViewTwo.contentMode          = UIViewContentModeScaleAspectFill;self.tranformFadeViewTwo.image                = [self currentImage];self.tranformFadeViewTwo.verticalCount        = 3;self.tranformFadeViewTwo.horizontalCount      = 30;self.tranformFadeViewTwo.center               = self.contentView.center;self.tranformFadeViewTwo.fadeDuradtion        = 1.f;self.tranformFadeViewTwo.animationGapDuration = 0.075f;[self.tranformFadeViewTwo buildMaskView];[self.contentView addSubview:self.tranformFadeViewTwo];[self.tranformFadeViewTwo fadeAnimated:NO];self.timer = [NSTimer timerWithTimeInterval:4 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];[[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSDefaultRunLoopMode];
}- (void)timerAction
{NSLog(@"adsf");if (self.type == kTypeOne) {self.type = kTypeTwo;[self.contentView sendSubviewToBack:self.tranformFadeViewTwo];self.tranformFadeViewTwo.image = [self currentImage];[self.tranformFadeViewTwo showAnimated:NO];[self.tranformFadeViewOne fadeAnimated:YES];} else {self.type = kTypeOne;[self.contentView sendSubviewToBack:self.tranformFadeViewOne];self.tranformFadeViewOne.image = [self currentImage];[self.tranformFadeViewOne showAnimated:NO];[self.tranformFadeViewTwo fadeAnimated:YES];}}
- (UIImage *)currentImage {self.count = ++self.count % self.images.count;return self.images[self.count];
}

@end

iOS 图片碎片化轮播相关推荐

  1. 图片碎片化mask动画

    图片碎片化mask动画 效果 源码 https://github.com/YouXianMing/Animations // // TransformFadeViewController.m // A ...

  2. html循环加载多个图片,两行代码实现图片碎片化加载

    今天来实现一个图片碎片化加载效果,效果如下: 我们分为 3 个步骤来实现: 定义 html 结构 拆分图片 编写动画函数 定义 html 结构 这里只需要一个 canvas 元素就可以了. id=&q ...

  3. html图片自动循环轮播图,js实现图片无缝循环轮播

    本文实例为大家分享了js实现图片无缝循环轮播的具体代码,供大家参考,具体内容如下 代码如下 Document #container{ overflow:hidden; width:400px; hei ...

  4. android 3d布局轮播,android 图片/视频混合轮播控件banner

    android 图片/视频混合轮播控件banner 在youth5201314的图片轮播控件做的修改 原作者github地址:https://github.com/youth5201314/banne ...

  5. css实现的图片列表切换轮播特效html页面前端源码

    大家好,今天给大家介绍一款, css实现的图片列表切换轮播特效html页面前端源码(图1).送给大家哦,获取方式在本文末尾. 图1 特效非常炫酷,可以用于制造音乐播放切换或视频播放切换前端(图2) 图 ...

  6. 利用jQuery实现图片无限循环轮播(不借助于轮播插件)

    原来我主要是用Bootstrap框架或者swiper插件实现轮播图的功能,而这次是用jQuery来实现图片无限循环轮播! 用到的技术有:html.css.JavaScript(少).jQuery(主要 ...

  7. 使用CSS实现简单的图片切换(轮播图)

    使用CSS实现简单的图片切换(轮播图) 预览图如下: 目录 使用CSS实现简单的图片切换(轮播图) 一:首先创建基本布局 1:创建一个div容器 ,里面的ul与ol标签分别对应轮播图片和下方圆点: 二 ...

  8. html js 3d图片轮播,js实现3D图片逐张轮播幻灯片特效代码分享

    本文实例讲述了javascript实现3D图片逐张轮播幻灯片特效.分享给大家供大家参考.具体如下: 这是一款基于javascript实现3D图片逐张轮播幻灯片特效代码,实现过程很简单. 运行效果图:- ...

  9. uniapp 实现图片自动纵向轮播

    ✴️星光不负赶路人,所有的幸运都来自于坚持不懈的努力,大家一起加油吧 问题:uniapp 实现图片自动纵向轮播 直接上代码 <template><view class="l ...

最新文章

  1. 【转】HashMap和HashSet的区别
  2. CodeForces - 1055C Lucky Days(数论)
  3. jQuery实现radio第一次点击选中第二次点击取消功能(转)
  4. 凡人修仙传显示无法连接服务器,《凡人修仙传》网络异常及橙色BOSS补偿说明...
  5. 网络协议文档阅读笔记-Introduction to DTLS(Datagram Transport Layer Security)
  6. MDI端口和MDIX端口是什么? 又有什么作用?
  7. java中继承applet类_java.applet.Applet类
  8. XCode使用自带SVN,SVN命令
  9. 菜鸟教程Python教程100例合集
  10. 【图像处理】色彩空间 YUV 420 SP / YUV 420 P 含义 RGB转换 YUV 黑色怎么表示
  11. 【快速上手教程2】疯壳·开源编队无人机-硬件资源简介
  12. 在线Base64编码/解码
  13. android闹钟铃声编码,Android 设置来电铃声、通知铃声、闹钟铃声中的坑
  14. idea 如何连接服务器
  15. cad的dwg如何转换成pdf?
  16. 网络安全——TCP/IP协议簇中的安全协议
  17. android新手用什么工具包,分享七个很是有用的Android开发工具和工具包
  18. pets 5考试准备
  19. js 中的可枚举属性
  20. 天肌1300和高通骁龙778g参数对比 天肌1300和骁龙778g哪个好

热门文章

  1. 计算机硬件和软件系统ppt,计算机硬件系统和软件系统.ppt
  2. php登录关闭验证码,phpcms关闭后台登陆验证码的方法
  3. matlab中norm(e),MATLAB中norm()的用法
  4. 我与CSDN的缘分——一年前的今天我甚至不知道什么叫大数据开发
  5. HTML-meta标签详解
  6. iOS开发:获取手机等设备当前的语言和地区的方法
  7. 我理解的IPTV盒子和OTT盒子的几个不同点
  8. 阿里大佬直播“大秀”在线告诉年薪百万的阿里P8顶尖人才,只因做到了这几点!
  9. 反转链表的循环和递归方式(python)
  10. 【iText5 生成PDF】纯Java代码实现生成PDF(自定义表格、文本水印、单元格样式)