使用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...
相关文章
- 「Python」面向对象封装案例2——摆放家具
- React-Hooks怎样封装防抖和节流-面试真题
- 解决python封装Logging模块后,log位置显示错误的问题
- Isaac64解密算法JNI的封装
- 可以对属性进行封装么_元器件封装类型
- 封装获取url参数的方法
- 【Android RTMP】音频数据采集编码 ( FAAC 编码器编码 AAC 音频解码信息 | 封装 RTMP 音频数据头 | 设置 AAC 音频数据类型 | 封装 RTMP 数据包 )
- 【愚公系列】2023年04月 WPF运动控制平台-004.运动控制平台轴卡通用类的封装
- 【前端探索】告别烂代码!用责任链模式封装网络请求
- HttpServletResponse详解:封装HTTP响应消息
- 革命性突破灵活封装Redis于Jar内(在jar中内嵌redis)
- c#使用DotNetZip封装类操作zip文件(创建/读取/更新)实例
- Java基础教程之封装与接口