UIBezierPath和CAShapeLayer應(yīng)用

CAShapeLayer 是 CALayer 的子類(lèi)聪黎,但是比 CALayer 更靈活,可以畫(huà)出各種圖形攒菠。

別忘記引入QuartzCore.framework

樣例####

在 CAShapeLayer 中寇僧,也可以像 CALayer 一樣指定它的 frame 來(lái)畫(huà),就像這樣:

- (void) Demo01View{
    CAShapeLayer *layer = [CAShapeLayer layer];
    layer.frame = CGRectMake(110, 100, 150, 100);
    layer.backgroundColor = [UIColor redColor].CGColor;
    [self.view.layer addSublayer:layer];
}
Demo01View

但是妄痪,CAShapeLayer 有一個(gè)神奇的屬性 path
用這個(gè)屬性配合上 UIBezierPath 這個(gè)類(lèi)就可以達(dá)到超神的效果哈雏。

UIBezierPath 顧名思義,這是用貝塞爾曲線的方式來(lái)構(gòu)建一段弧線衫生,你可以用任意條弧線來(lái)組成你想要的形狀裳瘪,比如,你想用它來(lái)和上面一樣畫(huà)一個(gè)矩形罪针,那就可以這樣子來(lái)做:

- (void) Demo02View{
    //矩形
    UIBezierPath *path01 = [UIBezierPath bezierPathWithRect:CGRectMake(110, 100, 150, 100)];
    CAShapeLayer *layer01 = [CAShapeLayer layer];
    layer01.path = path01.CGPath;
    layer01.fillColor = [UIColor clearColor].CGColor;//填充顏色 不要使用backgroundColor屬性
    layer01.strokeColor = [UIColor blackColor].CGColor;//邊框顏色
    [self.view.layer addSublayer:layer01];
    
    //圓角矩形
    UIBezierPath *path02 = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(110, 235, 150, 100) cornerRadius:50];
    CAShapeLayer *layer02 = [CAShapeLayer layer];
    layer02.path = path02.CGPath;
    layer02.fillColor = [UIColor clearColor].CGColor;
    layer02.strokeColor = [UIColor blackColor].CGColor;
    [self.view.layer addSublayer:layer02];
    
    //圓 順時(shí)針
    CGFloat radius = 60.0;//半徑
    CGFloat startAngle = 0.0;//開(kāi)始角度
    CGFloat endAngle = (M_PI * 2);//結(jié)束角度
    UIBezierPath *path03 = [UIBezierPath bezierPathWithArcCenter:CGPointMake([UIScreen mainScreen].bounds.size.width/2.0, 430.0) radius:radius startAngle:startAngle endAngle:endAngle clockwise:YES];
    CAShapeLayer *layer03 = [CAShapeLayer layer];
    layer03.path = path03.CGPath;
    layer03.fillColor = [UIColor clearColor].CGColor;
    layer03.strokeColor = [UIColor blackColor].CGColor;
    [self.view.layer addSublayer:layer03];
}
Demo02View

畫(huà)曲線####

貝塞爾曲線的畫(huà)法是由起點(diǎn)彭羹、終點(diǎn)、控制點(diǎn)三個(gè)參數(shù)來(lái)畫(huà)的泪酱,為了解釋清楚這個(gè)點(diǎn)派殷,我寫(xiě)了幾行代碼來(lái)解釋它


- (void) Demo03View{
    CGPoint startPoint = CGPointMake(50, 300);
    CGPoint endPoint = CGPointMake(300, 300);
    CGPoint controlPoint = CGPointMake(170, 200);
    
    CALayer *layer1 = [CALayer layer];
    layer1.frame = CGRectMake(startPoint.x, startPoint.y, 5, 5);
    layer1.backgroundColor = [UIColor redColor].CGColor;
    
    CALayer *layer2 = [CALayer layer];
    layer2.frame = CGRectMake(endPoint.x, endPoint.y, 5, 5);
    layer2.backgroundColor = [UIColor redColor].CGColor;
    
    CALayer *layer3 = [CALayer layer];
    layer3.frame = CGRectMake(controlPoint.x, controlPoint.y, 5, 5);
    layer3.backgroundColor = [UIColor redColor].CGColor;
    
    UIBezierPath *path = [UIBezierPath bezierPath];
    CAShapeLayer *layer = [CAShapeLayer layer];
    
    [path moveToPoint:startPoint];//移動(dòng)到起始點(diǎn)
    [path addQuadCurveToPoint:endPoint controlPoint:controlPoint];//結(jié)束點(diǎn)和控制點(diǎn)
    //CGPoint controlPoint1 = CGPointMake(133, 200);
    //CGPoint controlPoint2 = CGPointMake(216, 400);
    //[path addCurveToPoint:endPoint controlPoint1:controlPoint1 controlPoint2:controlPoint2];//使用兩個(gè)控制點(diǎn)來(lái)畫(huà)
    
    layer.path = path.CGPath;
    layer.fillColor = [UIColor clearColor].CGColor;
    layer.strokeColor = [UIColor blackColor].CGColor;
    
    [self.view.layer addSublayer:layer];
    [self.view.layer addSublayer:layer1];
    [self.view.layer addSublayer:layer2];
    [self.view.layer addSublayer:layer3];
}

Demo03View

CAShapeLayer動(dòng)畫(huà)###

動(dòng)畫(huà)使用 strokeEnd strokeStart lineWidth三個(gè)屬性

// layer是貝塞爾曲線
// 線從開(kāi)始點(diǎn)到結(jié)束點(diǎn)逐漸顯示
- (void) animation01:(CAShapeLayer *)layer{
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath: @"strokeEnd"];
    animation.fromValue = @0;
    animation.toValue = @1;
    animation.duration = 2.0;
    [layer addAnimation:animation forKey:@""];
}
// 線從中間向兩邊逐漸顯示
- (void) animation02:(CAShapeLayer *)layer{
    layer.strokeStart = 0.5;
    layer.strokeEnd = 0.5;
    
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"strokeStart"];
    animation.fromValue = @0.5;
    animation.toValue = @0;
    animation.duration = 2.0;
    
    CABasicAnimation *animation2 = [CABasicAnimation animationWithKeyPath: @"strokeEnd"];
    animation2.fromValue = @(0.5);
    animation2.toValue = @1;
    animation2.duration = 2.0;
    
    [layer addAnimation:animation forKey:@""];
    [layer addAnimation:animation2 forKey:@""];
}

// 線條變粗
- (void) animation03:(CAShapeLayer *)layer{
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath: @"lineWidth"];
    animation.fromValue = @1;
    animation.toValue = @10;
    animation.duration = 2.0;
    [layer addAnimation:animation forKey:@""];
}
- (void) Demo04View{
    CGSize finalSize = CGSizeMake(CGRectGetWidth(self.view.frame), 400);
    CGFloat layerHeight = finalSize.height * 0.2;
    CAShapeLayer *layer = [CAShapeLayer layer];
    UIBezierPath *bezier = [UIBezierPath bezierPath];
    [bezier moveToPoint:CGPointMake(0, finalSize.height - layerHeight)];
    [bezier addLineToPoint:CGPointMake(0, finalSize.height - 1)];
    [bezier addLineToPoint:CGPointMake(finalSize.width, finalSize.height - 1)];
    [bezier addLineToPoint:CGPointMake(finalSize.width, finalSize.height - layerHeight)];
    [bezier addQuadCurveToPoint:CGPointMake(0,finalSize.height - layerHeight) controlPoint:CGPointMake(finalSize.width / 2, (finalSize.height - layerHeight) - 40)];
    layer.path = bezier.CGPath;
    layer.fillColor = [UIColor blackColor].CGColor;
    [self.view.layer addSublayer:layer];
    
    
    //描點(diǎn)
    CALayer *layer1 = [CALayer layer];
    layer1.frame = CGRectMake(0, finalSize.height - layerHeight, 5, 5);
    layer1.backgroundColor = [UIColor redColor].CGColor;
    [self.view.layer addSublayer:layer1];
    
    CALayer *layer2 = [CALayer layer];
    layer2.frame = CGRectMake(0, finalSize.height - 1, 5, 5);
    layer2.backgroundColor = [UIColor redColor].CGColor;
    [self.view.layer addSublayer:layer2];
    
    CALayer *layer3 = [CALayer layer];
    layer3.frame = CGRectMake(finalSize.width-5, finalSize.height - 1, 5, 5);
    layer3.backgroundColor = [UIColor redColor].CGColor;
    [self.view.layer addSublayer:layer3];
    
    CALayer *layer4 = [CALayer layer];
    layer4.frame = CGRectMake(finalSize.width-5, finalSize.height - layerHeight, 5, 5);
    layer4.backgroundColor = [UIColor redColor].CGColor;
    [self.view.layer addSublayer:layer4];
    
    CALayer *layer5 = [CALayer layer];
    layer5.frame = CGRectMake(finalSize.width / 2, (finalSize.height - layerHeight) - 40, 5, 5);
    layer5.backgroundColor = [UIColor redColor].CGColor;
    [self.view.layer addSublayer:layer5];
}
Demo04View

應(yīng)用###

微信小眼睛
.h文件

#import <UIKit/UIKit.h>

@interface WXPullView : UIView

- (void)animationWith:(CGFloat)y;

@end

.m文件

#import "WXPullView.h"

@interface WXPullView ()

@property (strong, nonatomic) CAShapeLayer *eyeFirstLightLayer;
@property (strong, nonatomic) CAShapeLayer *eyeSecondLightLayer;
@property (strong, nonatomic) CAShapeLayer *eyeballLayer;
@property (strong, nonatomic) CAShapeLayer *topEyesocketLayer;
@property (strong, nonatomic) CAShapeLayer *bottomEyesocketLayer;

@end

@implementation WXPullView

- (instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        [self.layer addSublayer:self.eyeFirstLightLayer];
        [self.layer addSublayer:self.eyeSecondLightLayer];
        [self.layer addSublayer:self.eyeballLayer];
        [self.layer addSublayer:self.topEyesocketLayer];
        [self.layer addSublayer:self.bottomEyesocketLayer];
        [self setupAnimation];
    }
    return self;
}

- (CAShapeLayer *)eyeFirstLightLayer {
    if (!_eyeFirstLightLayer) {
        _eyeFirstLightLayer = [CAShapeLayer layer];
        CGPoint center = CGPointMake(CGRectGetWidth(self.frame) / 2, CGRectGetHeight(self.frame) / 2);
        UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:CGRectGetWidth(self.frame) * 0.2 startAngle:(230.f / 180.f) * M_PI endAngle:(265.f / 180.f) * M_PI clockwise:YES];
        _eyeFirstLightLayer.borderColor = [UIColor blackColor].CGColor;
        _eyeFirstLightLayer.lineWidth = 5.f;
        _eyeFirstLightLayer.path = path.CGPath;
        _eyeFirstLightLayer.fillColor = [UIColor clearColor].CGColor;
        _eyeFirstLightLayer.strokeColor = [UIColor whiteColor].CGColor;
    }
    return _eyeFirstLightLayer;
}

- (CAShapeLayer *)eyeSecondLightLayer {
    if (!_eyeSecondLightLayer) {
        _eyeSecondLightLayer = [CAShapeLayer layer];
        CGPoint center = CGPointMake(CGRectGetWidth(self.frame) / 2, CGRectGetHeight(self.frame) / 2);
        UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:CGRectGetWidth(self.frame) * 0.2 startAngle:(211.f / 180.f) * M_PI endAngle:(220.f / 180.f) * M_PI clockwise:YES];
        _eyeSecondLightLayer.borderColor = [UIColor blackColor].CGColor;
        _eyeSecondLightLayer.lineWidth = 5.f;
        _eyeSecondLightLayer.path = path.CGPath;
        _eyeSecondLightLayer.fillColor = [UIColor clearColor].CGColor;
        _eyeSecondLightLayer.strokeColor = [UIColor whiteColor].CGColor;
    }
    return _eyeSecondLightLayer;
}

- (CAShapeLayer *)eyeballLayer {
    if (!_eyeballLayer) {
        _eyeballLayer = [CAShapeLayer layer];
        CGPoint center = CGPointMake(CGRectGetWidth(self.frame) / 2, CGRectGetHeight(self.frame) / 2);
        UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:CGRectGetWidth(self.frame) * 0.3 startAngle:(0.f / 180.f) * M_PI endAngle:(360.f / 180.f) * M_PI clockwise:YES];
        _eyeballLayer.borderColor = [UIColor blackColor].CGColor;
        _eyeballLayer.lineWidth = 1.f;
        _eyeballLayer.path = path.CGPath;
        _eyeballLayer.fillColor = [UIColor clearColor].CGColor;
        _eyeballLayer.strokeColor = [UIColor whiteColor].CGColor;
        _eyeballLayer.anchorPoint = CGPointMake(0.5, 0.5);
    }
    return _eyeballLayer;
}

- (CAShapeLayer *)topEyesocketLayer {
    if (!_topEyesocketLayer) {
        _topEyesocketLayer = [CAShapeLayer layer];
        CGPoint center = CGPointMake(CGRectGetWidth(self.frame) / 2, CGRectGetHeight(self.frame) / 2);
        UIBezierPath *path = [UIBezierPath bezierPath];
        [path moveToPoint:CGPointMake(0, CGRectGetHeight(self.frame) / 2)];
        [path addQuadCurveToPoint:CGPointMake(CGRectGetWidth(self.frame), CGRectGetHeight(self.frame) / 2) controlPoint:CGPointMake(CGRectGetWidth(self.frame) / 2, center.y - center.y - 20)];
        _topEyesocketLayer.borderColor = [UIColor blackColor].CGColor;
        _topEyesocketLayer.lineWidth = 1.f;
        _topEyesocketLayer.path = path.CGPath;
        _topEyesocketLayer.fillColor = [UIColor clearColor].CGColor;
        _topEyesocketLayer.strokeColor = [UIColor whiteColor].CGColor;
    }
    return _topEyesocketLayer;
}

- (CAShapeLayer *)bottomEyesocketLayer {
    if (!_bottomEyesocketLayer) {
        _bottomEyesocketLayer = [CAShapeLayer layer];
        CGPoint center = CGPointMake(CGRectGetWidth(self.frame) / 2, CGRectGetHeight(self.frame) / 2);
        UIBezierPath *path = [UIBezierPath bezierPath];
        [path moveToPoint:CGPointMake(0, CGRectGetHeight(self.frame) / 2)];
        [path addQuadCurveToPoint:CGPointMake(CGRectGetWidth(self.frame), CGRectGetHeight(self.frame) / 2) controlPoint:CGPointMake(CGRectGetWidth(self.frame) / 2, center.y + center.y + 20)];
        _bottomEyesocketLayer.borderColor = [UIColor blackColor].CGColor;
        _bottomEyesocketLayer.lineWidth = 1.f;
        _bottomEyesocketLayer.path = path.CGPath;
        _bottomEyesocketLayer.fillColor = [UIColor clearColor].CGColor;
        _bottomEyesocketLayer.strokeColor = [UIColor whiteColor].CGColor;
    }
    return _bottomEyesocketLayer;
}

- (void)setupAnimation {
    self.eyeFirstLightLayer.lineWidth = 0.f;
    self.eyeSecondLightLayer.lineWidth = 0.f;
    self.eyeballLayer.opacity = 0.f;
    _bottomEyesocketLayer.strokeStart = 0.5f;
    _bottomEyesocketLayer.strokeEnd = 0.5f;
    _topEyesocketLayer.strokeStart = 0.5f;
    _topEyesocketLayer.strokeEnd = 0.5f;
}

- (void)animationWith:(CGFloat)y {
    CGFloat flag = self.frame.origin.y * 2.f - 20.f;
    if (y < flag) {
        if (self.eyeFirstLightLayer.lineWidth < 5.f) {
            self.eyeFirstLightLayer.lineWidth += 1.f;
            self.eyeSecondLightLayer.lineWidth += 1.f;
        }
    }
    if(y < flag - 20) {
        if (self.eyeballLayer.opacity <= 1.0f) {
            self.eyeballLayer.opacity += 0.1f;
        }
    }
    if (y < flag - 40) {
        if (self.topEyesocketLayer.strokeEnd < 1.f && self.topEyesocketLayer.strokeStart > 0.f) {
            self.topEyesocketLayer.strokeEnd += 0.1f;
            self.topEyesocketLayer.strokeStart -= 0.1f;
            self.bottomEyesocketLayer.strokeEnd += 0.1f;
            self.bottomEyesocketLayer.strokeStart -= 0.1f;
        }
    }
    if (y > flag - 40) {
        if (self.topEyesocketLayer.strokeEnd > 0.5f && self.topEyesocketLayer.strokeStart < 0.5f) {
            self.topEyesocketLayer.strokeEnd -= 0.1f;
            self.topEyesocketLayer.strokeStart += 0.1f;
            self.bottomEyesocketLayer.strokeEnd -= 0.1f;
            self.bottomEyesocketLayer.strokeStart += 0.1f;
        }
    }
    if (y > flag - 20) {
        if (self.eyeballLayer.opacity >= 0.0f) {
            self.eyeballLayer.opacity -= 0.1f;
        }
    }
    if (y > flag) {
        if (self.eyeFirstLightLayer.lineWidth > 0.f) {   
            self.eyeFirstLightLayer.lineWidth -= 1.f;
            self.eyeSecondLightLayer.lineWidth -= 1.f;
        }
    }
}
@end
微信小眼睛WXPullView.gif

彩虹進(jìn)度條
.h文件

#import <UIKit/UIKit.h>

@interface RainbowProgress : UIView

//Progress 高度
@property (nonatomic,assign)CGFloat progressHeigh;

//Progress Value (0~1)
@property (nonatomic,assign)CGFloat progressValue;

/** 開(kāi)始動(dòng)畫(huà)過(guò)程 */
- (void)startAnimating;
/** 結(jié)束動(dòng)畫(huà)過(guò)程 */
- (void)stopAnimating;

.m文件

#import "RainbowProgress.h"

@interface RainbowProgress ()<CAAnimationDelegate>

/** Animating */
@property (nonatomic,assign,getter=isAnimating)BOOL animating;

/** CAShapeLayer */
@property (nonatomic,weak)CAShapeLayer *shapeMaskLayer;

@end

@implementation RainbowProgress

#pragma mark - 將UIView默認(rèn)的CALayer替換成CAGradientLayer
+(Class)layerClass{
    return [CAGradientLayer class];
}

#pragma mark - 初始化方法
- (instancetype)initWithFrame:(CGRect)frame{
    CGRect originFrame = CGRectMake(0, self.progressHeigh, [UIScreen mainScreen].bounds.size.width, 2);
    self = [super initWithFrame:frame];
    if (self) {
        self.frame = originFrame;
        
        [self setUpRainbowLayer];
    }
    return self;
}
-(void)setUpRainbowLayer{
    // 1、創(chuàng)建CAGradientLayer彩虹條顏色層墓阀,彩虹顏色當(dāng)然需要數(shù)組存儲(chǔ)
    CAGradientLayer* gradientLayer = (CAGradientLayer*)self.layer;
    [gradientLayer setStartPoint:CGPointMake(0, 0)];
    [gradientLayer setEndPoint:CGPointMake(1, 0.01)];
    //gradientLayer.locations = @[@(0.001),@(0.001),@(0.001)];
    NSMutableArray *rainBowColors = [NSMutableArray array];
    for (NSInteger hue = 0; hue <= 360; hue += 5) {
        UIColor *color = [UIColor colorWithHue:1.0*hue/360.0
                                    saturation:1.0
                                    brightness:1.0
                                         alpha:1.0];
        [rainBowColors addObject:(id)color.CGColor];
    }
    gradientLayer.colors = [NSArray arrayWithArray:rainBowColors];
    
    // 2愈腾、創(chuàng)建遮罩層 同時(shí)也需要貝塞爾曲線
    UIBezierPath* shapePath = [UIBezierPath bezierPath];
    [shapePath moveToPoint:CGPointMake(0, 0)];
    [shapePath addLineToPoint:CGPointMake(self.bounds.size.width, 0)];
    
    CAShapeLayer* shapeMaskLayer = [CAShapeLayer layer];
    
    shapeMaskLayer.path = shapePath.CGPath;
    shapeMaskLayer.lineWidth = 4.f;
    shapeMaskLayer.fillColor = [UIColor clearColor].CGColor;
    shapeMaskLayer.strokeColor = [UIColor blackColor].CGColor;
    // 設(shè)置shapeMaskLayer的起止點(diǎn)初始值均為0
    shapeMaskLayer.strokeStart = 0;
    shapeMaskLayer.strokeEnd = 0;
    gradientLayer.mask = shapeMaskLayer;
    
    self.shapeMaskLayer = shapeMaskLayer;
     
}

#pragma mark - 執(zhí)行動(dòng)畫(huà)的過(guò)程
-(void)performAnimation{
    // Update the colors on the model layer
    
    CAGradientLayer *layer = (id)[self layer];
    NSArray *fromColors = [layer colors];
    NSArray *toColors = [self shiftColors:fromColors];
    [layer setColors:toColors];
    
    // Create an animation to slowly move the hue gradient left to right.
    
    CABasicAnimation *animation;
    animation = [CABasicAnimation animationWithKeyPath:@"colors"];
    [animation setFromValue:fromColors];
    [animation setToValue:toColors];
    [animation setDuration:0.08];                   // CALayer的color切換時(shí)間是0.08
    [animation setRemovedOnCompletion:YES];         // 動(dòng)畫(huà)完成后是否要移除
    [animation setFillMode:kCAFillModeForwards];
    [animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];
    [animation setDelegate:self];
    
    // Add the animation to our layer
    [layer addAnimation:animation forKey:@"animateGradient"];
}
/*
 當(dāng)動(dòng)畫(huà)在活動(dòng)時(shí)間內(nèi)完成或者是從層對(duì)象中移除這個(gè)代理方法會(huì)被調(diào)用,如果動(dòng)畫(huà)直到它的活動(dòng)時(shí)間末尾沒(méi)有被移除岂津,那這個(gè)'flag'是true的虱黄。
 回調(diào)和布爾值來(lái)保證動(dòng)畫(huà)的循環(huán)開(kāi)始并持續(xù)以及結(jié)束該動(dòng)畫(huà)
 */
- (void)animationDidStop:(CAAnimation *)animation finished:(BOOL)flag {
    // 當(dāng)動(dòng)畫(huà)在duration時(shí)間結(jié)束前移除了,這個(gè)方法會(huì)被調(diào)用
    // 然后就下面的if語(yǔ)句判斷吮成,如果isAnimation = yes橱乱,就重新執(zhí)行performAnimation
    // 在這個(gè)performAnimation中重新創(chuàng)建了核心動(dòng)畫(huà)對(duì)象辜梳,重新設(shè)置了代理
    if ([self isAnimating]) {
        [self performAnimation];
    }
}

- (void)startAnimating {
    if (![self isAnimating]) {
        self.animating = YES;
        [self performAnimation];
    }
}

- (void)stopAnimating {
    if ([self isAnimating]) {
        self.animating = NO;
    }
}
#pragma mark - 輔助方法:轉(zhuǎn)移可變數(shù)組最后一個(gè)元素到數(shù)組的最前面
- (NSArray *)shiftColors:(NSArray *)colors {
    // Moves the last item in the array to the front
    // shifting all the other elements.
    // 數(shù)組中最后一項(xiàng)移動(dòng)到前面
    // 轉(zhuǎn)移的所有其他元素
    NSMutableArray *mutable = [colors mutableCopy];// 將NSArray數(shù)組換成 NSMutableArray
    id last = [mutable lastObject]; // 單獨(dú)取出最后一個(gè)元素
    [mutable removeLastObject];              // 然后將數(shù)組中的最后一個(gè)元素去除
    [mutable insertObject:last atIndex:0];   // 然后將取出的元素插入到最前面
    return [NSArray arrayWithArray:mutable];
}
#pragma mark - 重寫(xiě)set和get方法
// 重設(shè)進(jìn)度條在父控件的高度位置
@synthesize progressHeigh = _progressHeigh;
-(void)setProgressHeigh:(CGFloat)progressHeigh{
    _progressHeigh = progressHeigh;
    // 就要重新設(shè)置RainbowProgress這個(gè)自定義UIView的高度
    CGRect frame = self.frame;
    frame.origin.y = _progressHeigh;
    self.frame = frame;
}
-(CGFloat)progressHeigh{
    if (!_progressHeigh) {
        _progressHeigh = 22;
    }
    return _progressHeigh;
}
// 設(shè)置進(jìn)度條的值
@synthesize progressValue = _progressValue;
-(void)setProgressValue:(CGFloat)progressValue{
    progressValue = progressValue > 1 ? 1 : progressValue;
    progressValue = progressValue < 0 ? 0 : progressValue;
    _progressValue = progressValue;
    self.shapeMaskLayer.strokeEnd = _progressValue;
}
-(CGFloat)progressValue{
    return _progressValue;
}
@end
彩虹進(jìn)度條 RainbowProgress.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市泳叠,隨后出現(xiàn)的幾起案子作瞄,更是在濱河造成了極大的恐慌,老刑警劉巖危纫,帶你破解...
    沈念sama閱讀 218,640評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宗挥,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡种蝶,警方通過(guò)查閱死者的電腦和手機(jī)契耿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)螃征,“玉大人搪桂,你說(shuō)我怎么就攤上這事《⒐觯” “怎么了踢械?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,011評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)魄藕。 經(jīng)常有香客問(wèn)我内列,道長(zhǎng),這世上最難降的妖魔是什么背率? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,755評(píng)論 1 294
  • 正文 為了忘掉前任德绿,我火速辦了婚禮,結(jié)果婚禮上退渗,老公的妹妹穿的比我還像新娘。我一直安慰自己蕴纳,他們只是感情好会油,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著古毛,像睡著了一般翻翩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上稻薇,一...
    開(kāi)封第一講書(shū)人閱讀 51,610評(píng)論 1 305
  • 那天嫂冻,我揣著相機(jī)與錄音,去河邊找鬼塞椎。 笑死桨仿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的案狠。 我是一名探鬼主播服傍,決...
    沈念sama閱讀 40,352評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼钱雷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了吹零?” 一聲冷哼從身側(cè)響起罩抗,我...
    開(kāi)封第一講書(shū)人閱讀 39,257評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎灿椅,沒(méi)想到半個(gè)月后套蒂,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,717評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茫蛹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評(píng)論 3 336
  • 正文 我和宋清朗相戀三年操刀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片麻惶。...
    茶點(diǎn)故事閱讀 40,021評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡馍刮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出窃蹋,到底是詐尸還是另有隱情卡啰,我是刑警寧澤,帶...
    沈念sama閱讀 35,735評(píng)論 5 346
  • 正文 年R本政府宣布警没,位于F島的核電站匈辱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏杀迹。R本人自食惡果不足惜亡脸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望树酪。 院中可真熱鬧浅碾,春花似錦、人聲如沸续语。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,936評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)疮茄。三九已至滥朱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間力试,已是汗流浹背徙邻。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,054評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留畸裳,地道東北人缰犁。 一個(gè)月前我還...
    沈念sama閱讀 48,224評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親民鼓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子薇芝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 前言:關(guān)于貝塞爾曲線與CAShapeLayer的學(xué)習(xí) 學(xué)習(xí)Demo演示: 貝塞爾曲線簡(jiǎn)單了解 使用UIBezier...
    麥穗0615閱讀 17,874評(píng)論 18 149
  • 前言 本文只要描述了iOS中的Core Animation(核心動(dòng)畫(huà):隱式動(dòng)畫(huà)、顯示動(dòng)畫(huà))丰嘉、貝塞爾曲線夯到、UIVie...
    GitHubPorter閱讀 3,628評(píng)論 7 11
  • 近日耍贾,因攜程親子園家長(zhǎng)哭訴視頻而人神公憤!作為有兩個(gè)孩子的母親路幸,p姐看的是在是好生氣荐开!在網(wǎng)上流出的視頻當(dāng)中,一位母...
    PMBA學(xué)院閱讀 455評(píng)論 0 0
  • 這些浮躁的社會(huì)里的浮躁的公司里的浮躁的部門(mén)里的一群浮躁的人简肴,我不要浮躁晃听,要堅(jiān)韌,堅(jiān)韌的做自己的事砰识,做別人看不上不關(guān)...
    陸小西閱讀 252評(píng)論 0 1
  • 你是那天上的一朵云 潔白便是你的美麗 隨風(fēng)飄向遠(yuǎn)處的你 地上的戀人你可會(huì)忘記 你是清晨的一縷陽(yáng)光 明媚和煦而又清涼...
    劍飛先森閱讀 94評(píng)論 0 1