辉光UIView的category

本人视频教程系类   iOS中CALayer的使用

效果如下:

源码:

UIView+GlowView.h 与 UIView+GlowView.m

//
//  UIView+GlowView.h
//  YouXianClock
//
//  Created by YouXianMing on 14-12-21.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import <UIKit/UIKit.h>@interface UIView (GlowView)@property (nonatomic, strong) NSNumber *GCDTimerInterval; // 定时器的时间间隔,给float值
@property (nonatomic, strong) NSNumber *glowDuration;     // layer动画的时间长度,给float值
@property (nonatomic, strong) NSNumber *glowLayerOpacity; // 设置glowLayer的动画透明度的程度,给float值,范围在[0,1]- (void)createGlowLayerWithColor:(UIColor *)color glowRadius:(CGFloat)radius;
- (void)startGlow;
- (void)glowToGlowLayerOnce;
- (void)glowToNormalLayerOnce;@end

//
//  UIView+GlowView.m
//  YouXianClock
//
//  Created by YouXianMing on 14-12-21.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import "UIView+GlowView.h"
#import <objc/runtime.h>#define GLOWVIEW_LAYER_FLAG     @"UIView+GlowView"@interface UIView ()@property (strong, nonatomic) dispatch_source_t  dispatchSource;
@property (strong, nonatomic) NSNumber          *glowViewShowFlag;@end@implementation UIView (GlowView)#pragma mark - 动态添加了属性
static char dispatchSourceTimerFlag;
- (void)setDispatchSource:(dispatch_source_t)dispatchSource {objc_setAssociatedObject(self, &dispatchSourceTimerFlag, dispatchSource, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (dispatch_source_t)dispatchSource {return objc_getAssociatedObject(self, &dispatchSourceTimerFlag);
}static char charGlowViewShowFlag;
- (void)setGlowViewShowFlag:(NSNumber *)glowViewShowFlag {objc_setAssociatedObject(self, &charGlowViewShowFlag, glowViewShowFlag, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSNumber *)glowViewShowFlag {return objc_getAssociatedObject(self, &charGlowViewShowFlag);
}static char GCDTimerIntervalFlag;
- (void)setGCDTimerInterval:(NSNumber *)GCDTimerInterval {objc_setAssociatedObject(self, &GCDTimerIntervalFlag, GCDTimerInterval, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSNumber *)GCDTimerInterval {return objc_getAssociatedObject(self, &GCDTimerIntervalFlag);
}static char glowLayerOpacityFlag;
- (void)setGlowLayerOpacity:(NSNumber *)glowLayerOpacity {objc_setAssociatedObject(self, &glowLayerOpacityFlag, glowLayerOpacity, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSNumber *)glowLayerOpacity {return objc_getAssociatedObject(self, &glowLayerOpacityFlag);
}static char glowDurationFlag;
- (void)setGlowDuration:(NSNumber *)glowDuration {objc_setAssociatedObject(self, &glowDurationFlag, glowDuration, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSNumber *)glowDuration {return objc_getAssociatedObject(self, &glowDurationFlag);
}#pragma mark - 方法
- (void)createGlowLayerWithColor:(UIColor *)color glowRadius:(CGFloat)radius {UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, [UIScreen mainScreen].scale);[self.layer renderInContext:UIGraphicsGetCurrentContext()];UIBezierPath* path = \[UIBezierPath bezierPathWithRect:(CGRect){CGPointZero, CGSizeMake(self.bounds.size.width, self.bounds.size.height)}];[color setFill];[path fillWithBlendMode:kCGBlendModeSourceAtop alpha:1.0];CALayer *glowLayer      = [CALayer layer];glowLayer.name          = GLOWVIEW_LAYER_FLAG;glowLayer.frame         = self.bounds;glowLayer.contents      = (__bridge id)UIGraphicsGetImageFromCurrentImageContext().CGImage;glowLayer.shadowOpacity = 1.0f;glowLayer.shadowOffset  = CGSizeMake(0, 0);glowLayer.shadowColor   = (color == nil ? [UIColor redColor].CGColor : color.CGColor);glowLayer.shadowRadius  = (radius > 0 ? radius : 2.f);glowLayer.opacity       = 0.f; // 开始时候的透明度为0
    [self.layer addSublayer:glowLayer];UIGraphicsEndImageContext();
}- (void)startGlow {[self.layer.sublayers enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {CALayer *layer = obj;// 找到了layer才进行下面的操作if ([layer.name isEqualToString:GLOWVIEW_LAYER_FLAG]) {if (self.glowViewShowFlag == nil) {self.glowViewShowFlag = [NSNumber numberWithBool:NO];}if (self.dispatchSource == nil) {self.dispatchSource = \dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());dispatch_source_set_timer(self.dispatchSource, dispatch_time(DISPATCH_TIME_NOW, 0),NSEC_PER_SEC * (self.GCDTimerInterval == nil ? 1 : self.GCDTimerInterval.floatValue), 0);dispatch_source_set_event_handler(self.dispatchSource, ^{if (self.glowViewShowFlag.boolValue == NO) {self.glowViewShowFlag = @(YES);// 做动画,从透明到显示出来CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];if (self.glowLayerOpacity != nil) {animation.fromValue = @(0.f);animation.toValue   = [NSNumber numberWithFloat:self.glowLayerOpacity.floatValue];layer.opacity       = self.glowLayerOpacity.floatValue;} else {animation.fromValue = @(0.f);animation.toValue   = @(0.8f);layer.opacity       = 0.8;}if (self.glowDuration != nil) {animation.duration = self.glowDuration.floatValue;} else {animation.duration = 0.8;}[layer addAnimation:animation forKey:nil];} else {self.glowViewShowFlag = @(NO);// 做动画CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];animation.fromValue         = [NSNumber numberWithFloat:layer.opacity];animation.toValue           = @(0.f);if (self.glowDuration != nil) {animation.duration = self.glowDuration.floatValue;layer.opacity      = 0.f;} else {animation.duration = 0.8;layer.opacity      = 0.f;}[layer addAnimation:animation forKey:nil];}});dispatch_resume(self.dispatchSource);}}}];
}- (void)glowToGlowLayerOnce {[self.layer.sublayers enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {CALayer *layer = obj;// 找到了layer才进行下面的操作if ([layer.name isEqualToString:GLOWVIEW_LAYER_FLAG]) {// 做动画,从透明到显示出来CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];if (self.glowLayerOpacity != nil) {animation.fromValue = @(0.f);animation.toValue   = [NSNumber numberWithFloat:self.glowLayerOpacity.floatValue];layer.opacity       = self.glowLayerOpacity.floatValue;} else {animation.fromValue = @(0.f);animation.toValue   = @(0.8f);layer.opacity       = 0.8;}if (self.glowDuration != nil) {animation.duration = self.glowDuration.floatValue;} else {animation.duration = 0.8;}[layer addAnimation:animation forKey:nil];}}];
}- (void)glowToNormalLayerOnce {[self.layer.sublayers enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {CALayer *layer = obj;// 做动画CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];animation.fromValue         = [NSNumber numberWithFloat:layer.opacity];animation.toValue           = @(0.f);if (self.glowDuration != nil) {animation.duration = self.glowDuration.floatValue;layer.opacity      = 0.f;} else {animation.duration = 0.8;layer.opacity      = 0.f;}[layer addAnimation:animation forKey:nil];}];
}@end

使用时候的源码:

//
//  ViewController.m
//  Glow
//
//  Created by YouXianMing on 14/12/21.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import "ViewController.h"
#import "UIView+GlowView.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];self.view.backgroundColor = [UIColor blackColor];// 普通labelUILabel *label      = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 100)];label.center        = self.view.center;label.font          = [UIFont fontWithName:@"HelveticaNeue-UltraLight" size:50.f];label.textAlignment = NSTextAlignmentCenter;label.text          = @"YouXianMing";label.textColor     = [UIColor redColor];label.GCDTimerInterval = @(2.f);label.glowDuration     = @(1.f);label.glowLayerOpacity = @(0.8f);[label createGlowLayerWithColor:[UIColor yellowColor] glowRadius:4.f];[label startGlow];[self.view addSubview:label];}@end

转载于:https://www.cnblogs.com/YouXianMing/p/4177244.html

辉光UIView的category相关推荐

  1. 辉光数码管中挥之不去的记忆

    简 介: 在我小时候的记忆中,所在县城粮油站显示计量白面和大米的电子秤就是使用的辉光数码管.致敬小时候的回忆,寒假制作一个辉光数码灯管,将会用于录制MOOC视频的特色背景动态装饰. 关键词: 辉光数码 ...

  2. 利用MEGA32制作辉光数码管显示电路

    简 介: 为了驱动两个辉光数码管,供有20个数字,使用MEGA32 MCU制作了一个秒表运行驱动电路板. 关键词: 辉光数码管,IN 12,MEGA32 #mermaid-svg-2FBANG5Zss ...

  3. IN-12辉光数码管:俄罗斯进口的器件

    简 介: 对于辉光数码管IN-12进行了初步的测试.改造了基于U3843A的高压产生模块,通过替换其中的功率器件使其能够稳定的输出160V电压,用于点亮辉光数码管. 关键词: IN 12,辉光数码管, ...

  4. GPU Gems1 - 21 实时辉光(Real-Time Glow)

    这章浅墨的文章讲的很细了,这里基本照扒一遍加深印象,原文链接:https://zhuanlan.zhihu.com/p/36499291 [章节概览] 这章讲到2D光照效果中的辉光(Glow)和光晕( ...

  5. ps发光插件_PS插件自定义区域发光真实辉光插件 Oniric Glow Generator for Photoshop【资源分享1444】...

    AE特效PR剪辑C4D影视后期 全世界只有不到1%的人关注了 你是个很特别的人 AE影视后期定期推送「AE+PR+C4D 影视特效合成 婚庆剪辑调色 电视广告包装 微电影制作 SpeedGrade达芬 ...

  6. threejs 局部辉光

    首先看一下局部辉光的效果. 困扰很久的问题,终于解决了!!! 具体找到解决的方法是看了这里和这里2.也是看了这两个帖子之后才找到解决方法. 这种辉光效果也是用后期处理方法,大家可以先看官网上的这个例子 ...

  7. iOS 开发 - 绘制辉光效果

    如何使曲线有辉光(荧光?)效果(glow)? 试了各种方法,最终有一点效果,觉得值得记录一下,如下. 1.最开始,我想是不是用shadow可以实现,事实证明,shadow 太淡,不醒目,如果多次sha ...

  8. THREEJS辉光与景深特效

    效果预览 辉光效果: 景深效果: 核心代码 辉光和景深尽量把场景背景设置为黑色,要不影响效果. // 设置场景背景色为黑色 scene.background = new THREE.Color(0, ...

  9. 自制NixieDisplay辉光数码管显示时钟

    最近偶然发现一种发光效果非常独特的数码管,非常感兴趣,于是查阅了一些资料,原来是电子管时代用于数字和符号显示的辉光数码管(nixie tube).与现在常见的LED驱动数码管不同,辉光管的是由金属符号 ...

最新文章

  1. Hadoop集群的基本操作(二:HBase的基本操作)
  2. [译] 解密 Uber 如何使用RNN预测极端事件
  3. @scheduled cron启动后和每小时执行_小耶哥: 一个Redis分布式锁又要和小鑫同学扯半个小时!...
  4. 重磅 | 一场你从未见过的数据中心盛会
  5. CentOS7Selinux设置
  6. 【转载】C/C++语言分析 每年学一种编程语言 git历史
  7. tomcat启动报错:Bean name 'XXX' is already used in this beans element
  8. 由塔科马大桥事件 谈软件架构
  9. [计组]寄存器和存储器的区别
  10. java.util.zip_[Java 基础] 使用java.util.zip包压缩和解压缩文件
  11. php 获取最后执行的sql,如何获取ThinkPHP框架最后一次执行SQL语句及变量调试
  12. 拓端tecdat|维度规约(降维)算法在WEKA中应用
  13. 微信小程序使用QQ音乐API完整实例
  14. 实战 Firefox 扩展开发
  15. 学习Java技术Eclipse版本的选择
  16. 解扩matlab,(完整版)BPSK调制的MATLAB仿真
  17. 批量导出二维码并生成压缩文件
  18. 朴素的模式匹配(布鲁特-福斯算法)
  19. linux系统安装视频播放器,Linux操作系统上安装Mplayer播放器的方法
  20. layer.open关闭弹窗,刷新表格

热门文章

  1. Linus系统下查看系统版本
  2. 电脑技巧:键盘上最长的按键空格键使用技巧!
  3. 分享几个路由器设置小技巧,总有用得到的一天!
  4. 远程办公的一天:魔幻24小时
  5. c++大文本比较_Excel – 将文本转换为数值,第二种方法会的请举左手
  6. 文治者必有武备不然长大了挨欺负_【博古斋·六月春拍】人文事者必有武备
  7. TCP三次握手、四次挥手、socket,tcp,http三者之间的区别和原理
  8. 配置树莓派linux的内核和编译并将镜像拷贝至树莓派
  9. django框架中表单
  10. ubuntu18 常用命令