辉光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(, );
glowLayer.shadowColor = (color == nil ? [UIColor redColor].CGColor : color.CGColor);
glowLayer.shadowRadius = (radius > ? radius : .f);
glowLayer.opacity = .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, , , dispatch_get_main_queue());
dispatch_source_set_timer(self.dispatchSource, dispatch_time(DISPATCH_TIME_NOW, ),
NSEC_PER_SEC * (self.GCDTimerInterval == nil ? : self.GCDTimerInterval.floatValue), );
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 = @(.f);
animation.toValue = [NSNumber numberWithFloat:self.glowLayerOpacity.floatValue];
layer.opacity = self.glowLayerOpacity.floatValue;
} else {
animation.fromValue = @(.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 = @(.f); if (self.glowDuration != nil) {
animation.duration = self.glowDuration.floatValue;
layer.opacity = .f;
} else {
animation.duration = 0.8;
layer.opacity = .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 = @(.f);
animation.toValue = [NSNumber numberWithFloat:self.glowLayerOpacity.floatValue];
layer.opacity = self.glowLayerOpacity.floatValue;
} else {
animation.fromValue = @(.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 = @(.f); if (self.glowDuration != nil) {
animation.duration = self.glowDuration.floatValue;
layer.opacity = .f;
} else {
animation.duration = 0.8;
layer.opacity = .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]; // 普通label
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(, , , )];
label.center = self.view.center;
label.font = [UIFont fontWithName:@"HelveticaNeue-UltraLight" size:.f];
label.textAlignment = NSTextAlignmentCenter;
label.text = @"YouXianMing";
label.textColor = [UIColor redColor]; label.GCDTimerInterval = @(.f);
label.glowDuration = @(.f);
label.glowLayerOpacity = @(0.8f); [label createGlowLayerWithColor:[UIColor yellowColor] glowRadius:.f];
[label startGlow]; [self.view addSubview:label]; } @end

辉光UIView的category的更多相关文章

  1. 辉光的UIView

    辉光的UIView 辉光UIView使用了一个UIView的一个category,名为UIView+Glow,请自行到github上查找. 源码如下: // // RootViewController ...

  2. Shimmer辉光动画效果

    Shimmer辉光动画效果 效果 源码 https://github.com/facebook/Shimmer https://github.com/YouXianMing/Animations // ...

  3. 使用CALayer制作View的辉光效果

    使用CALayer制作View的辉光效果 实现以下的辉光效果: 思路是这样子的: 1. 创建好需要实现辉光效果的View 2. 对这个View进行截图 3. 将这个截图重新添加进View中 4. 对这 ...

  4. 支持辉光效果的Label

    支持辉光效果的Label 效果 源码 https://github.com/YouXianMing/UI-Component-Collection 中的 FBGlowLabel // // FBGlo ...

  5. GraphicsLab Project之辉光(Glare,Glow)效果 【转】

    作者:i_dovelemon 日期:2016 / 07 / 02 来源:CSDN 主题:Render to Texture, Post process, Glare, Glow, Multi-pass ...

  6. iOS之UI--辉光动画

    前言:学习来自YouXianMing老师的博客:<辉光UIView的category>以及YouXianMing老师的github源码:< GlowView >    而我个人 ...

  7. iOS动画1 — UIView动画

    iOS动画基础是Core Animation核心动画.Core Animation是iOS平台上负责图形渲染与动画的基础设施.由于核心动画的实现比较复杂,苹果提供了实现简单动画的接口—UIView动画 ...

  8. RCLighting

    RCLighting https://github.com/RidgeCorn/RCLighting 效果: 真机测试的效率: 看了源码,其实原理很简单: ====================== ...

  9. iOS-UI-UI控件概述

    以下列举一些在开发中可能用得上的UI控件: IBAction和IBOutlet,UIView 1 @interface ViewController : UIViewController 2 3 @p ...

随机推荐

  1. 共识算法:Paxos

    两阶段提交 Two-phase Commit(2PC):保证一个事务跨越多个节点时保持 ACID 特性: 两类节点:协调者(Coordinator)和参与者(Participants),协调者只有一个 ...

  2. 02-python基本数据类型

    python的变量不需要声明, 但变量使用前必须复制, 因为python中所有的内容全部是对象 变量是没有类型的, 有类型的是指向内存对象的类型 a = ' a = 是合法的 此外, python还可 ...

  3. Redis的服务命令(实现开机自启动)

    在Redis的安装目录下,有一个redis.windows-service.conf文件,即默认的配置文件, 如果需要修改端口号,或者设置密码就需要修改其中的内容: 默认端口号是6379,你可以随意修 ...

  4. 从入门到不放弃系列之Koa2

    一.Koa2入门 本来是想Express入门的,但是既然都是要学,干嘛不学最新的呢? 其实我想说,我本来只是想学个小程序开发,现在已经陆陆续续开了好多坑了.. 本文参考廖雪峰教程 二.Async 最新 ...

  5. ABP-JavaScript API (转)

    转自:http://www.cnblogs.com/zd1994/p/7689164.html 因经常使用,备查 一.AJAX 1,ABP采用的方式 ASP.NET Boilerplate通过用abp ...

  6. 如何学习JavaEE,项目又该如何做?

    本文主要分为三个部分: 如何学习java基础 如何学习javaEE 你关心的项目问题 01 java基础学习 建议初学者看视频学习,不推荐看书.入门视频选择非常重要,最好是通俗易懂.深入浅出的教学视频 ...

  7. Chrome 谷歌如何快速实现跨域

    第一步:在你的E盘或者其他盘新建一个文件夹,命名为:E:\MyChromeDevUserData 第二步:找到你的谷歌浏览器快捷图标,鼠标右键选择属性,出现以下界面: 第三步:在目标选项的最后添加:  ...

  8. 怎么掌握微信小程序的取值、传值、数据存储

    小程序界面设定如下 父级页面:A界面 子级页面:B界面 异级页面:C界面 一.本页面取值(A界面→A界面) a.例如:input输入文字获取到value(键盘输入时触发) wxml: <inpu ...

  9. 常用算法1 - 快速排序 & 二分查找

    1. 二分查找法: 二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回对应的数组下标,没有找到返回-1. 二分查找法要求数据为一组有序的序列(大到小 ...

  10. 我理解的js中预解释

    浏览器在执行代码前,先找带var和带function的地方,把带var的声明且赋予初始值undefined,把带function的声明且定义. 带var关键字预解释 让我们先看下这段代码执行的结果: ...