zl程序教程

您现在的位置是:首页 >  前端

当前栏目

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

封装 显示 源代码 Facebook 进度 使用
2023-09-14 08:57:16 时间

使用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 ShimmeCircleView : UIView

 * 时候开启闪光效果,默认是 NO

@property (nonatomic, assign) BOOL shimmering;

 * 当 shimmering 开启时,进入到闪光状态中的动画时间,默认值是 0.3.

@property (nonatomic, assign) CFTimeInterval shimmeringBeginFadeDuration;

 * 当 shimmering 结束时,从闪光动画退出到正常的时间,默认值是 0.3.

@property (nonatomic, assign) CFTimeInterval shimmeringEndFadeDuration;

 * The opacity of the content before it is shimmering. Defaults to 0.3.

@property (nonatomic, assign) CGFloat shimmeringOpacity;

 * The time interval between shimmerings in seconds. Defaults to 0.6.

@property (nonatomic, assign) CFTimeInterval shimmeringPauseDuration;

 * 圆的颜色,默认为红色

@property (nonatomic, assign) UIColor *shapeColor;

 * 圆的线宽度,默认为1

@property (nonatomic, assign) CGFloat shapeLineWidth;

 * 动画时间间隔

@property (nonatomic, assign) CFTimeInterval strokeAnimationDuration;

 * 更新shapeLayer(修改后必须更新path才能够生效)

- (void)updateShapeLayer;

- (void)doPOPBasicEndAnimationToValue:(CGFloat)value;

- (void)doPOPBasicStartAnimationToValue:(CGFloat)value;

@end


//

// ShimmeCircleView.m

// YouXianMingClock

// Created by YouXianMing on 14-10-13.

// Copyright (c) 2014年 YouXianMing. All rights reserved.

#import "ShimmeCircleView.h"

#import "FBShimmering.h"

#import "FBShimmeringLayer.h"

#import "FBShimmeringView.h"

#import "POP.h"

 * 将角度转换为弧度

 * @param d 角度

 * @return 弧度

#define DEGREES__TO__RADIANS(d) ((d) * M_PI / 180.f)


CAShapeLayer *_shapeLayer; // 形状的layer FBShimmeringLayer *_showLayer; // 辉光的layer
_showLayer.shimmering = NO; // 默认设置关闭 _showLayer.shimmeringBeginFadeDuration = 0.3; // 开始进入闪光时候的时间 _showLayer.shimmeringEndFadeDuration = 0.3; // 从闪光进入没有闪光时候的时间 _showLayer.shimmeringOpacity = 0.3; _showLayer.shimmeringPauseDuration = 0.6f; [self.layer addSublayer:_showLayer]; // 制造形状的layer if (_shapeLayer == nil) { _shapeLayer = [CAShapeLayer layer]; _shapeLayer.lineWidth = 1.f; _shapeLayer.strokeEnd = 0.f; _shapeLayer.strokeColor = [UIColor redColor].CGColor; _shapeLayer.fillColor = [UIColor clearColor].CGColor; // 设置填充颜色为透明 _shapeLayer.path = [self createCirclePath].CGPath; _showLayer.contentLayer = _shapeLayer; return self; - (void)updateShapeLayer if (_shapeColor) { _shapeLayer.strokeColor = _shapeColor.CGColor; if (_shapeLineWidth 0) { _shapeLayer.lineWidth = _shapeLineWidth; _shapeLayer.path = [self createCirclePath].CGPath; // 更新path - (void)doPOPBasicEndAnimationToValue:(CGFloat)value [self doStrokeEndAnimationFromValue:_shapeLayer.strokeEnd toValue:value shapeLayer:_shapeLayer duration:(_strokeAnimationDuration 0 ? _strokeAnimationDuration : 0.4f) timingFunctionName:nil]; - (void)doPOPBasicStartAnimationToValue:(CGFloat)value [self doStrokeStartAnimationFromValue:_shapeLayer.strokeStart toValue:value shapeLayer:_shapeLayer duration:(_strokeAnimationDuration 0 ? _strokeAnimationDuration : 0.4f) timingFunctionName:nil]; * 根据frame值创建圆形的贝塞尔曲线 * @return 圆形的贝塞尔曲线 - (UIBezierPath *)createCirclePath UIBezierPath *path = \ [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.bounds.size.height / 2.f, self.bounds.size.width / 2.f) radius:self.bounds.size.height / 2.f - _shapeLayer.lineWidth / 2.f startAngle:DEGREES__TO__RADIANS(-90) endAngle:DEGREES__TO__RADIANS(270) clockwise:YES]; return path; #pragma mark - 重写各种setter方法 * 重写shimmering的setter,getter方法 @synthesize shimmering = _shimmering; - (BOOL)shimmering { return _shimmering; - (void)setShimmering:(BOOL)shimmering { _shimmering = shimmering; _showLayer.shimmering = shimmering; * 重写shimmeringBeginFadeDuration的setter,getter方法 @synthesize shimmeringBeginFadeDuration = _shimmeringBeginFadeDuration; - (CFTimeInterval)shimmeringBeginFadeDuration { return _shimmeringBeginFadeDuration; - (void)setShimmeringBeginFadeDuration:(CFTimeInterval)shimmeringBeginFadeDuration { _shimmeringBeginFadeDuration = shimmeringBeginFadeDuration; _showLayer.shimmeringBeginFadeDuration = shimmeringBeginFadeDuration; * 重写shimmeringEndFadeDuration的setter,getter方法 @synthesize shimmeringEndFadeDuration = _shimmeringEndFadeDuration; - (CFTimeInterval)shimmeringEndFadeDuration { return _shimmeringEndFadeDuration; - (void)setShimmeringEndFadeDuration:(CFTimeInterval)shimmeringEndFadeDuration { _shimmeringEndFadeDuration = shimmeringEndFadeDuration; _showLayer.shimmeringEndFadeDuration = shimmeringEndFadeDuration; * 重写shimmeringOpacity的setter,getter方法 @synthesize shimmeringOpacity = _shimmeringOpacity; - (CGFloat)shimmeringOpacity { return _shimmeringOpacity; - (void)setShimmeringOpacity:(CGFloat)shimmeringOpacity { _shimmeringOpacity = shimmeringOpacity; _showLayer.shimmeringOpacity = shimmeringOpacity; * 重写shimmeringPauseDuration的setter,getter方法 @synthesize shimmeringPauseDuration = _shimmeringPauseDuration; - (CFTimeInterval)shimmeringPauseDuration { return _shimmeringPauseDuration; - (void)setShimmeringPauseDuration:(CFTimeInterval)shimmeringPauseDuration { _shimmeringPauseDuration = shimmeringPauseDuration; _showLayer.shimmeringPauseDuration = shimmeringPauseDuration; #pragma mark - 私有方法 * StrokeEnd动画 * @param fromValue 初始值 * @param toValue 结束值 * @param layer 被动画的CAShapeLayer * @param duration 动画时间 * @param name 动画时间类型,可以选择的类型如下:kCAMediaTimingFunctionLinear kCAMediaTimingFunctionEaseIn kCAMediaTimingFunctionEaseOut kCAMediaTimingFunctionEaseInEaseOut kCAMediaTimingFunctionDefault - (void)doStrokeEndAnimationFromValue:(CGFloat)fromValue toValue:(CGFloat)toValue shapeLayer:(CAShapeLayer *)layer duration:(CFTimeInterval)duration timingFunctionName:(NSString *)name POPBasicAnimation *pathAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPShapeLayerStrokeEnd]; pathAnimation.duration = duration; if (name) { pathAnimation.timingFunction = [CAMediaTimingFunction functionWithName:name]; pathAnimation.fromValue = [NSNumber numberWithFloat:fromValue]; pathAnimation.toValue = [NSNumber numberWithFloat:toValue]; [layer pop_addAnimation:pathAnimation forKey:nil]; * StrokeStart动画 * @param fromValue 初始值 * @param toValue 结束值 * @param layer 被动画的CAShapeLayer * @param duration 动画时间 * @param name 动画时间类型,可以选择的类型如下:kCAMediaTimingFunctionLinear kCAMediaTimingFunctionEaseIn kCAMediaTimingFunctionEaseOut kCAMediaTimingFunctionEaseInEaseOut kCAMediaTimingFunctionDefault - (void)doStrokeStartAnimationFromValue:(CGFloat)fromValue toValue:(CGFloat)toValue shapeLayer:(CAShapeLayer *)layer duration:(CFTimeInterval)duration timingFunctionName:(NSString *)name POPBasicAnimation *pathAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPShapeLayerStrokeStart]; pathAnimation.duration = duration; if (name) { pathAnimation.timingFunction = [CAMediaTimingFunction functionWithName:name]; pathAnimation.fromValue = [NSNumber numberWithFloat:fromValue]; pathAnimation.toValue = [NSNumber numberWithFloat:toValue]; [layer pop_addAnimation:pathAnimation forKey:nil]; @end

以下是需要注意的地方:

以下是使用细节:


划重点|iOS15正式发布, 全新的通知推送系统,你必须要知道! 今年友盟+联合达摩院决策智能实验室讲算法技术,推出国内首个智能推送功能,帮助产品运营人员实现一键式触达的精细化运营。通过精心打磨的在线学习与优化算法,对推送人群与推送文案进行精准匹配,最大化用户点击量。通过对不同用户场景感知和各种约束配额下的最佳分配,将无用推送信息降权显示,降低对用户的干扰,优化用户维度的推送体验。
01 - app 的第一个执行代码的机会是什么 新建工程的时候,Xcode 默认创建的 AppDelegate 文件里面会有 UIApplicationDelegate 的 6 个代理方法,其中第一个是 application:didFinishLau...