TranformFadeView

效果图:

源码地址:

https://github.com/YouXianMing/UI-Component-Collection

注意:

maskView是iOS8中新出的,用以简化alpha遮罩的操作,与layer的mask是一回事,想要修改兼容的,请考虑使用layer的mask来满足你的需求.

特点:

* 方块的个数可以自己设定

* 你可以实现你自己的策略来设定渐变消失的方式

核心源码:

//
//  TranformFadeView.h
//  TransformationFadeView
//
//  Created by XianMingYou on 15/4/16.
//  Copyright (c) 2015年 XianMingYou. All rights reserved.
//

#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
//  TransformationFadeView
//
//  Created by XianMingYou on 15/4/16.
//  Copyright (c) 2015年 XianMingYou. All rights reserved.
//

#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;}// 承载所有的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             = 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: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 + 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

需要注意的细节:

[控件] TranformFadeView相关推荐

  1. Qt---布局,设置控件边距,拉伸因子

    QGridLayout *LeftLayout =new QGridLayout(this); LeftLayout->addWidget(label1, 0, 0); //label1在第1行 ...

  2. HarmonyOS 字体在自身控件中居中(使用text_alignment)

    要实现的效果就是把字体在控件居中 HarmonyOS  使用的是text_alignment 属性,详细的如下 text_alignment 文本对齐方式 left 表示文本靠左对齐. 可以设置取值项 ...

  3. Android 如何防止用户同时点击多个控件问题

    qa 测试说 一次连点不同的控件,app 多个控件分别有响应  这个问题处理方法也是很简单 就是在布局里面添加 android:splitMotionEvents="false"a ...

  4. Android中设置控件可见与不可见详解

    通常控件的可见与不可见分为三种情况. 第一种 gone 表示不可见并且不占用空间 第二种 visible 表示可见 第三种 invisible 表示不可见但是占用空间 可见与不可见的表现形式有两种. ...

  5. 文本类控件(EditView 的介绍)

    EditView的作用:用于在屏幕上显示文本输入框 Android的编辑框组件组件可以输入单行文本,多行文本,指定格式文本(密码,邮箱地址等) 2中使用方法 1 java代码中通过new关键字创建 2 ...

  6. 文本类控件 (TextView的介绍)

    TextView的作用:用于在屏幕上显示文本 Android中的文本框组件可以显示单行文本,多行文本,也可以显示带图像的文本 使用的2中方法 1 java代码中通过new关键字创建 2 XML布局中使 ...

  7. [UWP]实现一个轻量级的应用内消息通知控件

    [UWP]实现一个轻量级的应用内消息通知控件 原文:[UWP]实现一个轻量级的应用内消息通知控件 在UWP应用开发中,我们常常有向用户发送一些提示性消息的需求.这种时候我们一般会选择MessageDi ...

  8. MFC控件编程之复选框单选框分组框

    MFC控件编程之复选框单选框分组框 一丶分组框 分组框 英文叫做 GroubBox 添加了分组框主要就是分组.好看.不重点介绍 二丶单选框 英文: Raido Button 单选框需要注意的事项 1. ...

  9. 小程序中点击input控件键盘弹出时placeholder文字上移

    最近做的一个小程序项目中,出现了点击input控件键盘弹出时placeholder文字上移,刚开始以为是软键盘弹出布局上移问题是传说中典型的fixed 软键盘顶起问题,因此采纳了网上搜到的" ...

最新文章

  1. 《大话数据结构》第9章 排序 9.3 冒泡排序(下)
  2. Docker 极简入门教程,傻瓜都能看懂!
  3. Spring——Spring工具类
  4. 【springboot中使用拦截器】
  5. 关于单片机串口发送和接收的问题
  6. WebSocket 实现前后端通信的笔记
  7. 不写程序,整体就泡 土豆网电视剧
  8. 架构组件:基于shard-jdbc中间件,实现数据分库分表
  9. eclipse mysql jdbc驱动_java – 如何将JDBC mysql驱动程序添加到Eclipse项目?
  10. 【转】ASP.NET 表单验证实现浅析
  11. C++访问WebService
  12. unity3d自己写角色移动脚本
  13. 从小到大排列组合 php,求一个一维数组中,n个元素的不同组合,并返回该数组
  14. ERP ERP原理与应用试题(附答案)
  15. [Java学习] BFS算法示例
  16. “云桥”通往存储中心极速世界的通道
  17. 目标检测之Faster RCNN分析
  18. matlab 数组中的一个值,MATLAB数组元素引用的三种方法
  19. .net开发 abp框架+vue的微信公众号的微信授权
  20. 2.3、JavaScript 数据类型 - 数字类型

热门文章

  1. 论文推荐 | 2019中国卫星导航年会论文集
  2. maven pom java版本_Maven更新POM中的JDK版本(比如更新为JDK1.8)
  3. 计算机设备全年销量excel,计算机二级MS-OFFICE考试EXCEL题型汇总附答案.pdf
  4. c# 获取excel单元格公式结果_excel公式应用技巧:文字和数字混合的单元格,如何求和?...
  5. PyTorch机器学习从入门到实战
  6. lux系统服务器安装后多大,服务器环境搭建
  7. 工业用微型计算机(19)-指令系统(14)
  8. LINUX内核杂记(1)-处理器与单内核
  9. 【机器学习基础】xgboost系列丨xgboost建树过程分析及代码实现
  10. 2020年6月学术会议变动汇总