辉光UIView的category

辉光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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javascript 动态创建表格

<html><head><script>function createTable(rows,lines){this.rowsrows;this.lineslines;var Bodydocument.getElementById(body);var Tabledocument.createElement(table);//创建table标签元素Table.setAttribute(border,1);//给table标签添加其他属性for(v…

linux c之加入了加入原文件 math.h调用abs()函数出现implicit declaration of function错误

今天在vim 写C语言的时候 代码我已经导入了#include<math.h> 但是当我调用ads()函数的时候出现了下面错误 解决办法&#xff1a; 把abs函数改写成fabs函数就行&#xff0c;然后去网上找原因&#xff0c;发现fabs是求浮点数的&#xff0c;ads求整形的&#xff0c;以后在…

你的女神今日结婚了!!!你失恋了......

1 新垣结衣结了婚▼2 我和朋友最近的聊天内容&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 白粥盖浇饭&#xff1f;&#xff1f;&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 中国人的辈分可以复杂到什么程度&#xff1f;&#xff08…

我的技术回顾那些与ABP框架有关的故事-2017年

推荐阅读&#xff1a;我的技术回顾那些与ABP框架有关的故事-2015年从ABP框架国内社区发展回顾.NET技术变迁-2016年从2022年来回顾ABP框架&#xff0c;我们会发现无论是商业模式还是架构设计思路&#xff0c;如果没有良好的商业模式的话&#xff0c;ABP框架很容易进入难产的状态…

Camera360与全球1.8亿用户共同创造更美的照片

Camera360是成都品果科技有限公司推出的基于IOS、Windows Phone和安卓系统的功能强大的手机摄影软件。能拍摄出不同风格&#xff0c;不同特效的照片&#xff0c;同时具有互联网分享功能。Camera360在全球拥有1.8亿用户&#xff0c;国外0.95亿&#xff0c;国内0.85亿&#xff0c…

八皇后问题(一)

问题描述: 要在8*8的国际象棋棋盘中放8个皇后,使任意两个皇后都不能互相吃掉。规则是皇后能吃掉同一行、同一列、同一对角线的棋子。如下图即是两种方案: 思路: 比如我们搞个数组,数组的下表表示多少行,然后数值表示多少列,比如a[4] = 5,意思就代表第四行,第五列 首先…

linux shell 嵌套expect 与服务器交互脚本

2019独角兽企业重金招聘Python工程师标准>>> 我们与服务器进行交互是该用expect 脚本的&#xff0c;用 “/usr/bin/expect <<-EOF” 来开启expect 脚本 用spawn 来开启一个新的进程 expect 来接受命令&#xff0c;send来发送交互命令 结束用 EOF来over expect…

SkyWalking集成与案例

今天我们通过代码的形式来了解下&#xff0c;如何在项目中使用Skywalking。前几篇文章可以参考&#xff1a;《学习Skywalking 搭建篇》《Skywalking执行效果 多图篇》《Skywalking的ES索引 收藏篇》今天说说代码篇。先说下比较常见的开源 APM 如下&#xff1a;CAT&#xff1…

Windows Azure 安全最佳实践 - 第 6 部分:Azure 服务如何扩展应用程序安全性

多种 Windows Azure服务可以帮助您将应用程序安全性扩展到云。 有三种服务可提供多个提供程序之间的身份标识映射、内部部署数据中心间的连接和相互发送消息的应用程序功能&#xff08;无论应用程序位于何处&#xff09;。 使用Windows Azure Active Directory&#xff0c;您…

Windows Server 2012活动目录基础配置与应用(新手教程)之3---将客户机加入到指定域...

在WIN 2012服务器上安装AD后&#xff0c;WIN2012就从普通的服务器变成了域控制器。一个域也就产生了。但遗憾的是&#xff0c;目前这个域的规模还很小&#xff0c;只有DC这一台主机-------光杆司令&#xff01;&#xff01;下面尝试扩大域的规模&#xff0c;将客户机加入到域。…

论物理学界的神预言

全世界只有3.14 % 的人关注了爆炸吧知识一沙见世界 一花窥天堂手心握无限 须臾纳永恒杨振宁曾说读上面的四句诗可以感受到物理的美但物理的美不止于此物理还有一种庄严美一种神秘美一种初窥宇宙奥秘的畏惧美物理就是如此的迷人任何语言在它的面前都很贫瘠数学让人摆脱了愚昧而…

聊一聊如何用C#轻松完成一个SAGA分布式事务

背景 银行跨行转账业务是一个典型分布式事务场景&#xff0c;假设 A 需要跨行转账给 B&#xff0c;那么就涉及两个银行的数据&#xff0c;无法通过一个数据库的本地事务保证转账的 ACID &#xff0c;只能够通过分布式事务来解决。市面上使用比较多的分布式事务框架&#xff0c…

梯度消失和梯度爆炸_知识干货-动手学深度学习-05 梯度消失和梯度爆炸以及Kaggle房价预测...

梯度消失和梯度爆炸考虑到环境因素的其他问题Kaggle房价预测梯度消失和梯度爆炸深度模型有关数值稳定性的典型问题是消失&#xff08;vanishing&#xff09;和爆炸&#xff08;explosion&#xff09;。当神经网络的层数较多时&#xff0c;模型的数值稳定性容易变差。PyTorch的默…

Js中 关于top、clientTop、scrollTop、offsetTop的用法

2019独角兽企业重金招聘Python工程师标准>>> Js中 关于top、clientTop、scrollTop、offsetTop的用法 网页可见区域宽&#xff1a; document.body.clientWidth; 网页可见区域高&#xff1a; document.body.clientHeight; 网页可见区域宽&#xff1a; document.body.…

UVa 1639 (期望) Candy

题意&#xff1a; 两个盒子里各有n颗糖&#xff0c;每天有p的概率从第一个盒子里取一颗糖&#xff0c;1-p的概率从第二个盒子里去一颗糖。直到某一天打开某个盒子忽然发现没糖了&#xff0c;求另一个盒子里剩余糖果数的期望。 分析&#xff1a; 紫书上面已经分析的很清楚了&…

C#中的串口通信SerialPort

前言大家好&#xff0c;我是阿辉。今天这篇文章带大家学习下C#中的串口通讯。在日常的开发工作中&#xff0c;如果工作内容是CS方向的同学应该很容易接触到串口通讯方面的业务需求。那么也就很容易想到C#中SerialPort类&#xff0c;它就是专门来处理串口通讯相关的。了解什么是…

日本的酒店主题能有多丰富?

1 伤害性不大&#xff0c;侮辱性极强&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 好家伙&#xff0c;这字医生都看不懂&#xff01;&#xff08;via.你的野王&#xff0c;侵删&#xff09;▼3 当家里点了电子蜡烛&#xff08;素材来源网络&#xff0c;侵删&…

6款程序员不得不爱的bootstrap模板

Bootstrap是基于jQuery框架开发的&#xff0c;它在jQuery框架的基础上进行了更为个性化和人性化的完善&#xff0c;形成一套自己独有的网站风格&#xff0c;并兼容大 部分jQuery插件。Bootstrap中包含了丰富的Web组件&#xff0c;根据这些组件&#xff0c;可以快速的搭建一个漂…

Natasha 4.0 探索之路系列(四) 模板 API

相关文章Natasha 4.0 探索之路系列(一) 概况Natasha 4.0 探索之路系列(二) 「域」与插件Natasha 模板Natasha 在编译单元的基础上进行了封装整理, 并提供了多种模板帮助开发者构建功能.使用此篇的 API 前提是您对 C# 非常熟悉, 对系统的一些类型足够了解.据此 Natasha 将拒绝与…