iOS 图片碎片化轮播
在项目中,常常用到轮播图,我们常常会想到用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 图片碎片化轮播相关推荐
- 图片碎片化mask动画
图片碎片化mask动画 效果 源码 https://github.com/YouXianMing/Animations // // TransformFadeViewController.m // A ...
- html循环加载多个图片,两行代码实现图片碎片化加载
今天来实现一个图片碎片化加载效果,效果如下: 我们分为 3 个步骤来实现: 定义 html 结构 拆分图片 编写动画函数 定义 html 结构 这里只需要一个 canvas 元素就可以了. id=&q ...
- html图片自动循环轮播图,js实现图片无缝循环轮播
本文实例为大家分享了js实现图片无缝循环轮播的具体代码,供大家参考,具体内容如下 代码如下 Document #container{ overflow:hidden; width:400px; hei ...
- android 3d布局轮播,android 图片/视频混合轮播控件banner
android 图片/视频混合轮播控件banner 在youth5201314的图片轮播控件做的修改 原作者github地址:https://github.com/youth5201314/banne ...
- css实现的图片列表切换轮播特效html页面前端源码
大家好,今天给大家介绍一款, css实现的图片列表切换轮播特效html页面前端源码(图1).送给大家哦,获取方式在本文末尾. 图1 特效非常炫酷,可以用于制造音乐播放切换或视频播放切换前端(图2) 图 ...
- 利用jQuery实现图片无限循环轮播(不借助于轮播插件)
原来我主要是用Bootstrap框架或者swiper插件实现轮播图的功能,而这次是用jQuery来实现图片无限循环轮播! 用到的技术有:html.css.JavaScript(少).jQuery(主要 ...
- 使用CSS实现简单的图片切换(轮播图)
使用CSS实现简单的图片切换(轮播图) 预览图如下: 目录 使用CSS实现简单的图片切换(轮播图) 一:首先创建基本布局 1:创建一个div容器 ,里面的ul与ol标签分别对应轮播图片和下方圆点: 二 ...
- html js 3d图片轮播,js实现3D图片逐张轮播幻灯片特效代码分享
本文实例讲述了javascript实现3D图片逐张轮播幻灯片特效.分享给大家供大家参考.具体如下: 这是一款基于javascript实现3D图片逐张轮播幻灯片特效代码,实现过程很简单. 运行效果图:- ...
- uniapp 实现图片自动纵向轮播
✴️星光不负赶路人,所有的幸运都来自于坚持不懈的努力,大家一起加油吧 问题:uniapp 实现图片自动纵向轮播 直接上代码 <template><view class="l ...
最新文章
- 【转】HashMap和HashSet的区别
- CodeForces - 1055C Lucky Days(数论)
- jQuery实现radio第一次点击选中第二次点击取消功能(转)
- 凡人修仙传显示无法连接服务器,《凡人修仙传》网络异常及橙色BOSS补偿说明...
- 网络协议文档阅读笔记-Introduction to DTLS(Datagram Transport Layer Security)
- MDI端口和MDIX端口是什么? 又有什么作用?
- java中继承applet类_java.applet.Applet类
- XCode使用自带SVN,SVN命令
- 菜鸟教程Python教程100例合集
- 【图像处理】色彩空间 YUV 420 SP / YUV 420 P 含义 RGB转换 YUV 黑色怎么表示
- 【快速上手教程2】疯壳·开源编队无人机-硬件资源简介
- 在线Base64编码/解码
- android闹钟铃声编码,Android 设置来电铃声、通知铃声、闹钟铃声中的坑
- idea 如何连接服务器
- cad的dwg如何转换成pdf?
- 网络安全——TCP/IP协议簇中的安全协议
- android新手用什么工具包,分享七个很是有用的Android开发工具和工具包
- pets 5考试准备
- js 中的可枚举属性
- 天肌1300和高通骁龙778g参数对比 天肌1300和骁龙778g哪个好
热门文章
- 计算机硬件和软件系统ppt,计算机硬件系统和软件系统.ppt
- php登录关闭验证码,phpcms关闭后台登陆验证码的方法
- matlab中norm(e),MATLAB中norm()的用法
- 我与CSDN的缘分——一年前的今天我甚至不知道什么叫大数据开发
- HTML-meta标签详解
- iOS开发:获取手机等设备当前的语言和地区的方法
- 我理解的IPTV盒子和OTT盒子的几个不同点
- 阿里大佬直播“大秀”在线告诉年薪百万的阿里P8顶尖人才,只因做到了这几点!
- 反转链表的循环和递归方式(python)
- 【iText5 生成PDF】纯Java代码实现生成PDF(自定义表格、文本水印、单元格样式)