使用 maskView 设计动画

1.maskView(maskLayer) 基本原理 :可类比于多张png图片叠加遮罩

2.maskView配合CAGradientLayer,alpha通道图片的使用.maskView是iOS8以上才有,如果要考虑兼容低版本,用maskLayer替换

3.设计方本横向渐变消失的控件

一、两张png图片叠加遮罩

- (void)addMaskView

{

CGFloat width = 120;

//
使用maskView的情况

UIImageView *addImageView= [[UIImageView
alloc] initWithFrame:CGRectMake(20,
20 , width, width)];

[self.view addSubView: addImageView];

addImageView.image      = [UIImage
imageNamed:@"base"];

UIImageView *mask       = [[UIImageView
alloc] initWithFrame:CGRectMake(0,
0, width, width)];

mask.image              = [UIImage
imageNamed:@"mask"];

// maskView并不能用addSubview来添加遮罩,这点千万注意

addImageView.maskView   = mask;

}

二、maskView 配合 CAGradientLayer 的使用

1.用CAGradientLayer直接产生带透明像素通道的layer

2.用maskView直接加载带CAGradientLayer的view

3.可以通过对CAGradientLayer进行动画的操作实现动画效果

- (void)addGradientLayer {

//
加载图片

UIImageView *imageView = [[UIImageView
alloc] initWithFrame:CGRectMake(20,
20, 200,
200)];

imageView.image        = [UIImage
imageNamed:@"base"];

[self.view
addSubview:imageView];

//
创建出CAGradientLayer,

//可以对gradientLayer的frame,colors.locations.startPoint,endPoint进行动画效果

CAGradientLayer *gradientLayer = [CAGradientLayer
layer];

gradientLayer.frame            = imageView.bounds;

gradientLayer.colors           =
@[(__bridge
id)[UIColor
clearColor].CGColor,

(__bridge
id)[UIColor
blackColor].CGColor,

(__bridge
id)[UIColor
clearColor].CGColor];

gradientLayer.locations        =
@[@(0.25), @(0.5),
@(0.75)];//设置位置点

gradientLayer.startPoint       =
CGPointMake(0,
0);//设置方向

gradientLayer.endPoint         =
CGPointMake(1,
0);

//
容器view --> 用于加载创建出的CAGradientLayer

UIView *containerView = [[UIView
alloc] initWithFrame:imageView.bounds];

[containerView.layer
addSublayer:gradientLayer];

//
设定maskView

imageView.maskView  = containerView;

CGRect frame        = containerView.frame;

frame.origin.x     -=
200;

//
重新赋值

containerView.frame = frame;

//
给maskView做动画效果

[UIView
animateWithDuration:3.f
animations:^{

// 改变位移

CGRect frame        = containerView.frame;

frame.origin.x     +=
400;

// 重新赋值

containerView.frame = frame;

}];

}

三、设计文本横向渐变消失的控件

1.新建一个类

@interface FadeString :
UIView

/**

*  输入文本

*/

@property (nonatomic,
strong) NSString *text;

/**

*  向右渐变消失

*/

- (void)fadeRight;

- (void)fadeRightWithDuration:(NSTimeInterval)druation animaited:(BOOL)animated;

@end

#import "FadeString.h"

@interface FadeString ()

@property (nonatomic,
strong) UILabel *label;

@property (nonatomic,
strong) UIView  *mask; 
// 作为遮罩的mask

@end

@implementation FadeString

- (instancetype)initWithFrame:(CGRect)frame {

self = [super
initWithFrame:frame];

if (self) {

//
创建出label

[self
createLabel:self.bounds];

//
创建出mask

[self
createMask:self.bounds];

}

return
self;

}

- (void)createLabel:(CGRect)frame {

self.label               = [[UILabel
alloc] initWithFrame:frame];

self.label.font          = [UIFont
systemFontOfSize:30.f];

self.label.textAlignment
= NSTextAlignmentCenter;

self.label.textColor     = [UIColor
redColor];

[self
addSubview:self.label];

}

- (void)createMask:(CGRect)frame {

//
创建出渐变的layer

CAGradientLayer *gradientLayer = [CAGradientLayer
layer];

gradientLayer.frame            = frame;

gradientLayer.colors           =
@[(__bridge
id)[UIColor
clearColor].CGColor,

(__bridge
id)[UIColor
blackColor].CGColor,

(__bridge
id)[UIColor
blackColor].CGColor,

(__bridge
id)[UIColor
clearColor].CGColor];

gradientLayer.locations        =
@[@(0.01), @(0.1),
@(0.9), @(0.99)];

gradientLayer.startPoint       =
CGPointMake(0,
0);

gradientLayer.endPoint         =
CGPointMake(1,
0);

//
创建并接管mask

self.mask     = [[UIView
alloc] initWithFrame:frame];

// mask获取渐变layer

[self.mask.layer
addSublayer:gradientLayer];

self.maskView =
self.mask;

}

- (void)fadeRight {

[UIView
animateWithDuration:3.f
animations:^{

CGRect frame    =
self.mask.frame;

frame.origin.x += frame.size.width;

self.mask.frame = frame;

}];

}

- (void)fadeRightWithDuration:(NSTimeInterval)druation animaited:(BOOL)animated

{

if (animated) {

[UIView
animateWithDuration:druation animations:^{

CGRect frame    =
self.mask.frame;

frame.origin.x += frame.size.width;

self.mask.frame = frame;

}];

}else{

CGRect frame    =
self.mask.frame;

frame.origin.x += frame.size.width;

self.mask.frame = frame;

}

}

/**

*  重写setter,getter方法

*/

@synthesize text = _text;

- (void)setText:(NSString *)text {

_text           = text;

self.label.text = text;

}

- (NSString *)text {

return _text;

}

@end

- (void)viewDidLoad {

[super
viewDidLoad];

self.view.backgroundColor = [UIColor
blackColor];

//
创建FadeString

FadeString *fadeString = [[FadeString
alloc] initWithFrame:CGRectMake(0,
0, 300,
40)];

fadeString.text        =
@"hello world";

fadeString.center      =
self.view.center;

[self.view
addSubview:fadeString];

//
执行动画效果

[fadeString
fadeRight];

}

二、切换图片

@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

#import "TranformFadeView.h"

#define  STATR_TAG  0x19871220

@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;

}

//
承载所有的maskView

self.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             =
STATR_TAG + 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:UIViewAnimationOptionCurveLinear

animations:^{

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:UIViewAnimationOptionCurveLinear

animations:^{

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 +
STATR_TAG];

}

/* 重写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

调用:

#import "ViewController.h"

#import "TranformFadeView.h"

typedef
enum : NSUInteger {

TYPE_ONE,

TYPE_TWO,

} EType;

@interface
ViewController ()

@property (nonatomic,
strong) TranformFadeView *tranformFadeViewOne;

@property (nonatomic,
strong) TranformFadeView *tranformFadeViewTwo;

@property (nonatomic,
strong) NSTimer          *timer;

@property (nonatomic)        
EType             type;

@end

@implementation ViewController

- (void)viewDidLoad {

[super
viewDidLoad];

self.view.backgroundColor = [UIColor
blackColor];

//
图片1

self.tranformFadeViewOne                 = [[TranformFadeView
alloc]
initWithFrame:self.view.bounds];

self.tranformFadeViewOne.contentMode
    = UIViewContentModeScaleAspectFill;

self.tranformFadeViewOne.image           = [UIImage
imageNamed:@"1"];

self.tranformFadeViewOne.verticalCount   =
2;

self.tranformFadeViewOne.horizontalCount =
12;

self.tranformFadeViewOne.center          =
self.view.center;

[self.tranformFadeViewOne
buildMaskView];

self.tranformFadeViewOne.fadeDuradtion        =
1.f;

self.tranformFadeViewOne.animationGapDuration =
0.1f;

[self.view
addSubview:self.tranformFadeViewOne];

//
图片2

self.tranformFadeViewTwo                 = [[TranformFadeView
alloc]
initWithFrame:self.view.bounds];

self.tranformFadeViewTwo.contentMode
    = UIViewContentModeScaleAspectFill;

self.tranformFadeViewTwo.image           = [UIImage
imageNamed:@"2"];

self.tranformFadeViewTwo.verticalCount   =
2;

self.tranformFadeViewTwo.horizontalCount =
12;

self.tranformFadeViewTwo.center          =
self.view.center;

[self.tranformFadeViewTwo
buildMaskView];

self.tranformFadeViewTwo.fadeDuradtion        =
1.f;

self.tranformFadeViewTwo.animationGapDuration =
0.1f;

[self.view
addSubview:self.tranformFadeViewTwo];

[self.tranformFadeViewTwo
fadeAnimated:YES];

//
定时器

self.timer = [NSTimer
scheduledTimerWithTimeInterval:6

target:self

selector:@selector(timerEvent)

userInfo:nil

repeats:YES];

self.type  =
TYPE_ONE;

}

- (void)timerEvent {

if (self.type ==
TYPE_ONE) {

self.type =
TYPE_TWO;

[self.view
sendSubviewToBack:self.tranformFadeViewTwo];

[self.tranformFadeViewTwo
showAnimated:NO];

[self.tranformFadeViewOne
fadeAnimated:YES];

}
else {

self.type =
TYPE_ONE;

[self.view
sendSubviewToBack:self.tranformFadeViewOne];

[self.tranformFadeViewOne
showAnimated:NO];

[self.tranformFadeViewTwo
fadeAnimated:YES];

}

}

@end

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-18 23:14:42

使用 maskView 设计动画的相关文章

使用maskView设计动画效果

在 极客学院 简单学习了一下 如何使用maskView设计动画效果 主要是通过CAGradientLayer 或者 带有alpha的图片来操作 //MARK:1. maskView(maskLayer)基本原理 CGFloat width = 120.f; //底图 self.baseImageView = [[UIImageView alloc]initWithFrame:CGRectMake(20, 20, width, width)]; [_baseImageView setImage:[

纯css3开发的响应式设计动画菜单(支持ie8)

这是一个响应式设计的菜单.单击列表图标,当你显示屏大小可以完全水平放下所有菜单项时,菜单水平显示(如图1).当你的显示屏不能水平放置所有菜单项时,菜单垂直显示(如图2). 而且显示的时候是以动画的型式显示.效果相当的好. 点击这里在线预览 下面贴出实现这功能的源代码,这是一个纯用css3实现的菜单 html代码: <div class="container"> <!--[if lte IE 8]> <style> .iconicmenu > l

设计动画显示窗体

一.实例介绍 本文实现的动画是指,窗体显示的时候慢慢显示到用户面前,窗体关闭时,有一个动态效果! 二.设计思路 需要使用Windows提供的API函数AnimateWindow(),该函数存放在user.dll文件中,该函数的声明方法如下: [DllImport("user32.dll")]        private static extern bool AnimateWindow(IntPtr hwnd,int dwTime,int dwFlags); 其中参数意义如下: hwn

极客学院录制课程合集

iOS 中 CALayer 的使用 iOS 中 CAShapeLayer 的使用 iOS 中 CAGradientLayer 的使用 用缓动函数模拟物理动画 使用 Facebook 开源动画库 POP 实现真实衰减与弹簧动画 GCD 编程 设计复杂的 iOS 动画效果 iOS 模糊效果的使用 使用 maskView 设计动画 使用带粒子效果的 CAEmitterLayer 使用 CoreImage 处理图片

极客学院iOS开发工程师初级+中级+高级视频教程

下载地址:百度网盘下载 课程目录: 初级IOS开发工程师 19课程 7小时50分职业介绍1.iOS 开发的前世今生C语言基础 1.二级 C 流程控制 2.二级 C 函数与指针 3.二级 C 数组4.二级 C 字符串5.二级 C 作用域.预处理与存储 6.二级 C 结构体与共用体 7.二级 C 文件Swift语言基础1.Swift 语言基础2.Swift 中的字符串和集合 3.Swift 中的函数和闭包 4.Swift 面向对象基础(上)5.Swift 面向对象基础(中) 6.Swift 面向对象

用状态机来设计cell动画

前言 一个cell可能有好几种状态,比方说选中状态与未选中状态,以及失效状态等等状态,我们将这些不同的情形抽象成一个个状态机,用状态机切换逻辑来设计复杂的动画效果,达到简化设计的目的,大大增加程序可维护性. * 大家需要注意一点,cell因为是可以复用的控件,因为存在复用,所以里面存在较为恶心的复用逻辑,设计动画接口时是需要注意这些小细节的.(亲手写过的人一定会深有体会) 效果 源码 https://github.com/YouXianMing/CellStateAnimation // //

动画中的模块化设计

1.动画效果实现难度的判断 2.将看到的动画效果拆分成小模块 3.将写好的小模块组合成你所需要的动画效果 一,新建一个BaseAnimationView主控类 @interface BaseAnimationView : UIView - (void)show; - (void)hide; - (void)buildView; @end #import "BaseAnimationView.h" #import "CircleView.h" #import &quo

[转]Expression Blend实例中文教程(8) - 动画设计快速入门StoryBoard

上一篇,介绍了Silverlight动画设计基础知识,Silverlight动画是基于时间线的,对于动画的实现,其实也就是对对象属性的修改过程. 而Silverlight动画分类两种类型,From/To/By 动画和关键帧动画. 对于Silverlight动画设计,StoryBoard是非常重要的一个功能,StoryBoard不仅仅可以对动画的管理,而且还可以对动画的细节进行控制,例如控制动画的播放,暂停,停止以及跳转动画位置等. 为了简化开发人员和设计人员的设计过程,Blend提供了专门的工具

零元学Expression Blend 4 - Chapter 6 如何置入Photoshop档案以及入门动画设计

原文:零元学Expression Blend 4 - Chapter 6 如何置入Photoshop档案以及入门动画设计 本章将教大家如何把Photoshop档案置入Expression Blend 4,以及设置简单的动画. 只要按照步骤来,就能很容易的做出动画的效果. ? 本章将教大家如何把Photoshop档案置入Expression Blend 4,以及设置简单的动画. 只要按照步骤来,就能很容易的做出动画的效果. ? 就是要让不会的新手都看的懂! ? ------------------