辉光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];
// 普通label
UILabel *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
时间: 2024-11-18 06:43:04