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