辉光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-08-23 12:04:37

辉光UIView的category的相关文章

使用CALayer制作View的辉光效果

使用CALayer制作View的辉光效果 实现以下的辉光效果: 思路是这样子的: 1. 创建好需要实现辉光效果的View 2. 对这个View进行截图 3. 将这个截图重新添加进View中 4. 对这个截图实现改变透明度的动画 ViewController.m // // ViewController.m // // Copyright (c) 2013 Nick Jensen. All rights reserved. // #import "ViewController.h" #i

iOS 开发 - 绘制辉光效果

如何使曲线有辉光(荧光?)效果(glow)? 试了各种方法,最终有一点效果,觉得值得记录一下,如下. 1.最开始,我想是不是用shadow可以实现,事实证明,shadow 太淡,不醒目,如果多次shadow叠加,可加重一点,但性能不好,放弃: 2.然后想是不是可以用图片沿着path绘制,结果效果也不理想(也许是图片做的不好),性能也不好 3.Spritekit 中 skshapenode 可以设置辉光,而且可以设置用texture绘制,貌似可以解决问题,但是当线段之间夹角太小时,结合部位的辉光可

Shimmer辉光动画效果

效果 源码 https://github.com/facebook/Shimmer https://github.com/YouXianMing/Animations // // ShimmerController.m // Animations // // Created by YouXianMing on 15/12/18. // Copyright © 2015年 YouXianMing. All rights reserved. // #import "ShimmerController

支持辉光效果的Label

效果 源码 https://github.com/YouXianMing/UI-Component-Collection 中的 FBGlowLabel // // FBGlowLabel.h // // Created by YouXianMing on 16/8/3. // Copyright © 2016年 YouXianMing. All rights reserved. // // https://github.com/lyokato/fbglowlabel // #import <UI

【Photoshop】辉光文字制作

1.新建文件 2.执行滤镜——纹理——颗粒 3.执行滤镜——艺术效果——霓虹灯光,设定大小.亮度.发光颜色 4.输入文字 5.设置字体.间距 6.设置中心对齐排列 7.设置文字图层的图层样式,设置为外发光 8.为了加强发光的效果,进行复制多个图层 9.在副本3图层上,执行滤镜——模糊——动感模糊 10.新建立一图层,用铅笔工具绘制一些白色的短线 11.执行滤镜——风格化——风 12.最终效果! 现在良师益友网上有面向设计人员开展的“冰桶挑战”活动,大家一起来挑战自我吧!!

iOS动画1 — UIView动画

iOS动画1 — UIView动画 iOS动画基础是Core Animation核心动画.Core Animation是iOS平台上负责图形渲染与动画的基础设施.由于核心动画的实现比较复杂,苹果提供了实现简单动画的接口—UIView动画.UIView动画封装在UIView的Category中,主要实现一些简单和常用的动画.UIView动画是对核心动画进行了一层封装,所以最终动画还是通过Core Animation的接口实现. 主要的动画效果都可以通过UIView动画和Core Animation

IOS动画实现(3)UIView封装的动画

苹果官网文档 UIView触发动画的方式分为两类,打开UIView.h头文件可以看到两个UIView的Category, @interface UIView(UIViewAnimation) 以及 @interface UIView(UIViewAnimationWithBlocks) 两种动画的方式就在此了.姑且命名为commit方式和block方式.两种实现方式,效果大同小异,只是代码实现不同而已. 文档里面描述的,可以动画起来的属性有以下七种 @"frame",@"bo

使用Facebook开源代码FBShimmering封装进度显示的ShimmeCircleView

效果图: 静态图: 源码: ShimmeCircleView.h 与 ShimmeCircleView.m // // ShimmeCircleView.h // YouXianMingClock // // Created by YouXianMing on 14-10-13. // Copyright (c) 2014年 YouXianMing. All rights reserved. // #import <UIKit/UIKit.h> @interface ShimmeCircleV

CSS3 阴影(text-shadow)

在以前,阴影效果一般都是做成图片,现在有了CSS3 可以直接使用text-shadow 属性来实现阴影.这个属性可以有两个作用,产生阴影和模糊主体.这样在不需要图片的情况下就能给文字增加质感. 基本语法: text-shadow : none | <length> none | [<shadow>, ] * <shadow> 或none | <color> [, <color> ]* 也就是: text-shadow:[颜色(Color)  x轴