// // HIKLoadView.m // VideoGo // // Created by zhil.shi on 15/3/9. // Copyright (c) 2015年 HIKVison. All rights reserved. // #import "HIKLoadView.h" #import "HIKLoadViewItem.h" #import "HIKLoadViewItem+configPath.h" static float SQUARE_FIT_LEN = 14.0; @interface HIKLoadView () @property (nonatomic,strong) CALayer *animationLayer; @property (nonatomic,strong) HIKLoadViewItem *blueCircle; @property (nonatomic,strong) HIKLoadViewItem *greenCircle; @property (nonatomic,strong) HIKLoadViewItem *redCircle; @property (nonatomic,strong) HIKLoadViewItem *yellowCircle; @property (nonatomic,strong) UILabel *percentLable; @end @implementation HIKLoadView #pragma mark - init 初始化 - (instancetype)initWithHIKLoadViewStyle:(HIKLoadViewStyle)style { self = [super init]; if(!self)return nil; switch (style) { case HIKLoadViewStyleSqureClockWise: { [self setFrame:CGRectMake(0.0, 0.0, SQUARE_FIT_LEN, SQUARE_FIT_LEN)]; [self p_setUp]; [self p_setUpCircleLayersCenter]; } break; case HIKLoadViewStyleSqureCornersClockWise: { [self setFrame:CGRectMake(0.0, 0.0, SQUARE_FIT_LEN, SQUARE_FIT_LEN)]; [self p_setUp]; [self p_setUpCorcleLayersSquareCorners]; } break; default: break; } return self; } - (instancetype)initWithHIKLoadViewStyle:(HIKLoadViewStyle)style frame:(CGRect)frame { self = [super initWithFrame:frame]; if(!self)return nil; switch (style) { case HIKLoadViewStyleSqureClockWise: { [self p_setUp]; [self p_setUpCircleLayersCenter]; } break; case HIKLoadViewStyleSqureCornersClockWise: { [self p_setUp]; [self p_setUpCorcleLayersSquareCorners]; } break; default: break; } return self; } #pragma mark -setUp 私有方法相关设置 - (void)p_setUp { [self setBackgroundColor:[UIColor clearColor]]; [self p_setUpCircleLayers]; } /** * 初始化需要的layer */ - (void)p_setUpCircleLayers { if(!self.animationLayer) { self.animationLayer = self.layer; } if(!self.yellowCircle) { UIImage* yellowImage = [UIImage imageNamed:@"logo_loading_4"]; self.yellowCircle = [HIKLoadViewItem initWithImage:yellowImage]; [self.animationLayer addSublayer:self.yellowCircle.colorCirculeLayer]; } if(!self.redCircle) { UIImage* redImage = [UIImage imageNamed:@"logo_loading_3"]; self.redCircle = [HIKLoadViewItem initWithImage:redImage]; [self.animationLayer addSublayer:self.redCircle.colorCirculeLayer]; } if(!self.greenCircle) { UIImage* greenImage = [UIImage imageNamed:@"logo_loading_2"]; self.greenCircle = [HIKLoadViewItem initWithImage:greenImage]; [self.animationLayer addSublayer:self.greenCircle.colorCirculeLayer]; } if(!self.blueCircle) { UIImage* blueImage = [UIImage imageNamed:@"logo_loading_1"]; self.blueCircle = [HIKLoadViewItem initWithImage:blueImage]; [self.animationLayer addSublayer:self.blueCircle.colorCirculeLayer]; } } /** * 初始化百分比显示lable */ - (void)p_initPercentLable { if(self.percentLable)return; self.percentLable = [[UILabel alloc]init]; [self.percentLable setBackgroundColor:[UIColor clearColor]]; [self.percentLable setTextAlignment:NSTextAlignmentCenter]; } /** * 移除layers傻姑娘的所有动画 */ - (void)p_removeAllAniamations { [self.blueCircle.colorCirculeLayer removeAllAnimations]; [self.greenCircle.colorCirculeLayer removeAllAnimations]; [self.redCircle.colorCirculeLayer removeAllAnimations]; [self.yellowCircle.colorCirculeLayer removeAllAnimations]; } /** * 设置正方形顺时针旋转动画 */ - (void)p_setUpAnimations { [self.blueCircle configKeyFrameAnimationForColorLayerWithStartLoadingStyle:HIKLoadViewStartFromLeftTop]; [self.greenCircle configKeyFrameAnimationForColorLayerWithStartLoadingStyle:HIKLoadViewStartFromRightTop]; [self.redCircle configKeyFrameAnimationForColorLayerWithStartLoadingStyle:HIKLoadViewStartFromLeftBottom]; [self.yellowCircle configKeyFrameAnimationForColorLayerWithStartLoadingStyle:HIKLoadViewStartFromRightBottom]; } - (void)p_setUpCircleLayersCenter { CGPoint centerPoint = CGPointMake(SQUARE_FIT_LEN/2.0, SQUARE_FIT_LEN/2.0); [self.yellowCircle setPosition:centerPoint]; [self.redCircle setPosition:centerPoint]; [self.greenCircle setPosition:centerPoint]; [self.blueCircle setPosition:centerPoint]; } - (void)p_stayCircleLayersPresentationLayerPosition { [self.yellowCircle stayOnPresentationLayerPosition]; [self.redCircle stayOnPresentationLayerPosition]; [self.greenCircle stayOnPresentationLayerPosition]; [self.blueCircle stayOnPresentationLayerPosition]; [self.greenCircle.colorCirculeLayer setOpacity:0]; [self.redCircle.colorCirculeLayer setOpacity:0]; [self.blueCircle.colorCirculeLayer setOpacity:0]; [self.yellowCircle.colorCirculeLayer setOpacity:0]; } /** * 设置起始位置为正方形四角 */ - (void)p_setUpCorcleLayersSquareCorners { CGPoint leftTop = CGPointMake(0.0, 0.0); CGPoint rightTop = CGPointMake(SQUARE_FIT_LEN, 0.0); CGPoint rightBottom = CGPointMake(SQUARE_FIT_LEN, SQUARE_FIT_LEN); CGPoint leftBottom = CGPointMake(0.0, SQUARE_FIT_LEN); [self.blueCircle setPosition:leftTop]; [self.greenCircle setPosition:rightTop]; [self.yellowCircle setPosition:rightBottom]; [self.redCircle setPosition:leftBottom]; } #pragma mark -animations - (void)updateReadytoClockwiseAnimationWithPercent:(float)percent { if(percent < 0.0 || percent > 1.0) { return; } percent = ((int)(percent * 10))/10.0; CGPoint center = CGPointMake(CGRectGetMidX(self.frame) -CGRectGetMinX(self.frame), CGRectGetMidY(self.frame)-CGRectGetMinY(self.frame)); CGPoint blueTargetPoint = CGPointMake(center.x * (1-percent), center.y * (1-percent)); CGPoint greenTargetPoint = CGPointMake(center.x * (1+percent), center.y * (1-percent)); CGPoint yellowTargetPoint = CGPointMake(center.x * (1+percent), center.y * (1+percent)); CGPoint redTargetPoint = CGPointMake(center.x * (1-percent), center.y * (1+percent)); [self.blueCircle setPosition:blueTargetPoint];//blue最上层,透明度不设置 [self.greenCircle setPosition:greenTargetPoint]; [self.redCircle setPosition:redTargetPoint]; [self.yellowCircle setPosition:yellowTargetPoint]; [self.blueCircle.colorCirculeLayer setOpacity:1.0]; [self.redCircle.colorCirculeLayer setOpacity:percent]; [self.greenCircle.colorCirculeLayer setOpacity:percent]; [self.yellowCircle.colorCirculeLayer setOpacity:percent]; } - (void)startSquareClcokwiseAnimation { [self p_removeAllAniamations]; [self p_setUpCircleLayersCenter]; dispatch_async(dispatch_get_main_queue(), ^{ [self p_setUpAnimations]; }); } - (void)stopSquareClockwiseAnimation { [self p_stayCircleLayersPresentationLayerPosition]; [self p_removeAllAniamations]; } @end