[控件] TranformFadeView
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相关推荐
- Qt---布局,设置控件边距,拉伸因子
QGridLayout *LeftLayout =new QGridLayout(this); LeftLayout->addWidget(label1, 0, 0); //label1在第1行 ...
- HarmonyOS 字体在自身控件中居中(使用text_alignment)
要实现的效果就是把字体在控件居中 HarmonyOS 使用的是text_alignment 属性,详细的如下 text_alignment 文本对齐方式 left 表示文本靠左对齐. 可以设置取值项 ...
- Android 如何防止用户同时点击多个控件问题
qa 测试说 一次连点不同的控件,app 多个控件分别有响应 这个问题处理方法也是很简单 就是在布局里面添加 android:splitMotionEvents="false"a ...
- Android中设置控件可见与不可见详解
通常控件的可见与不可见分为三种情况. 第一种 gone 表示不可见并且不占用空间 第二种 visible 表示可见 第三种 invisible 表示不可见但是占用空间 可见与不可见的表现形式有两种. ...
- 文本类控件(EditView 的介绍)
EditView的作用:用于在屏幕上显示文本输入框 Android的编辑框组件组件可以输入单行文本,多行文本,指定格式文本(密码,邮箱地址等) 2中使用方法 1 java代码中通过new关键字创建 2 ...
- 文本类控件 (TextView的介绍)
TextView的作用:用于在屏幕上显示文本 Android中的文本框组件可以显示单行文本,多行文本,也可以显示带图像的文本 使用的2中方法 1 java代码中通过new关键字创建 2 XML布局中使 ...
- [UWP]实现一个轻量级的应用内消息通知控件
[UWP]实现一个轻量级的应用内消息通知控件 原文:[UWP]实现一个轻量级的应用内消息通知控件 在UWP应用开发中,我们常常有向用户发送一些提示性消息的需求.这种时候我们一般会选择MessageDi ...
- MFC控件编程之复选框单选框分组框
MFC控件编程之复选框单选框分组框 一丶分组框 分组框 英文叫做 GroubBox 添加了分组框主要就是分组.好看.不重点介绍 二丶单选框 英文: Raido Button 单选框需要注意的事项 1. ...
- 小程序中点击input控件键盘弹出时placeholder文字上移
最近做的一个小程序项目中,出现了点击input控件键盘弹出时placeholder文字上移,刚开始以为是软键盘弹出布局上移问题是传说中典型的fixed 软键盘顶起问题,因此采纳了网上搜到的" ...
最新文章
- 《大话数据结构》第9章 排序 9.3 冒泡排序(下)
- Docker 极简入门教程,傻瓜都能看懂!
- Spring——Spring工具类
- 【springboot中使用拦截器】
- 关于单片机串口发送和接收的问题
- WebSocket 实现前后端通信的笔记
- 不写程序,整体就泡 土豆网电视剧
- 架构组件:基于shard-jdbc中间件,实现数据分库分表
- eclipse mysql jdbc驱动_java – 如何将JDBC mysql驱动程序添加到Eclipse项目?
- 【转】ASP.NET 表单验证实现浅析
- C++访问WebService
- unity3d自己写角色移动脚本
- 从小到大排列组合 php,求一个一维数组中,n个元素的不同组合,并返回该数组
- ERP ERP原理与应用试题(附答案)
- [Java学习] BFS算法示例
- “云桥”通往存储中心极速世界的通道
- 目标检测之Faster RCNN分析
- matlab 数组中的一个值,MATLAB数组元素引用的三种方法
- .net开发 abp框架+vue的微信公众号的微信授权
- 2.3、JavaScript 数据类型 - 数字类型
热门文章
- 论文推荐 | 2019中国卫星导航年会论文集
- maven pom java版本_Maven更新POM中的JDK版本(比如更新为JDK1.8)
- 计算机设备全年销量excel,计算机二级MS-OFFICE考试EXCEL题型汇总附答案.pdf
- c# 获取excel单元格公式结果_excel公式应用技巧:文字和数字混合的单元格,如何求和?...
- PyTorch机器学习从入门到实战
- lux系统服务器安装后多大,服务器环境搭建
- 工业用微型计算机(19)-指令系统(14)
- LINUX内核杂记(1)-处理器与单内核
- 【机器学习基础】xgboost系列丨xgboost建树过程分析及代码实现
- 2020年6月学术会议变动汇总