美文网首页动画
UIBezierPath 贝塞尔曲线的几种基本用法

UIBezierPath 贝塞尔曲线的几种基本用法

作者: 古子林 | 来源:发表于2017-06-07 11:14 被阅读35次

<h5>闲来无事总结了一下贝塞尔曲线的几种基本用法。
包括:直线、曲线、连续曲线、连续折线、圆弧、空心圆、实心圆、椭圆、矩形、圆角矩形、背景渐变色、圆弧渐变色。</h5>

</br>
</br>
<h3>所有效果如下图:</h3>

效果图.png

</br>
<h3>下面是这些效果的代码:</h3>
<h4>1、线</h4>

- (void)stroke1{
    
    // 直线
    [[UIColor redColor] set];
    UIBezierPath *path = [UIBezierPath bezierPath];
    [path moveToPoint:CGPointMake(100, 50)];
    [path addLineToPoint:CGPointMake(200, 50)];
    path.lineWidth = 10.0f;
    [path stroke];
    

    // 曲线
    [[UIColor purpleColor] set];
    UIBezierPath *path2 = [UIBezierPath bezierPath];
    path2.lineWidth = 5.0f;
    [path2 moveToPoint:CGPointMake(50, 100)];
    [path2 addQuadCurveToPoint:CGPointMake(100, 100) controlPoint:CGPointMake(75, 200)];
    [path2 stroke];
    
    
    // 连续曲线
    [[UIColor orangeColor] set];
    UIBezierPath *path3 = [UIBezierPath bezierPath];
    path3.lineWidth = 3.0f;
    [path3 moveToPoint:CGPointMake(150, 150)];
    [path3 addCurveToPoint:CGPointMake(300, 150) controlPoint1:CGPointMake(200, 200) controlPoint2:CGPointMake(250, 100)];
    [path3 stroke];
    

    // 连续折线
    [[UIColor blueColor] set];
    UIBezierPath *path4 = [UIBezierPath bezierPath];
    path4.lineWidth = 5.0f;
    [path4 moveToPoint:CGPointMake(50, 200)];
    [path4 addLineToPoint:CGPointMake(100, 300)];
    [path4 addLineToPoint:CGPointMake(150, 200)];
    [path4 addLineToPoint:CGPointMake(200, 250)];
//    [path4 closePath]; // 连接起始点
    path4.lineCapStyle = kCGLineCapRound; // 两端样式
    path4.lineJoinStyle = kCGLineCapSquare; // 拐角处样式
    [path4 stroke];
    

    // 圆弧
    [[UIColor blackColor] set];
    UIBezierPath *path5 = [UIBezierPath bezierPathWithArcCenter:CGPointMake(280, 220) radius:50 startAngle:-M_PI_4 endAngle:M_PI clockwise:YES];
    path5.lineWidth = 4.0f;
    [path5 stroke];
}

<h4>2、面</h4>

- (void)stroke2{
    
    // 空心圆
    [[UIColor darkGrayColor] set];
    // 这个frame代表的是圆外矩形的大小
    UIBezierPath *path1 = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(20, 300, 80, 80)];
    path1.lineWidth = 5.0f;
    [path1 stroke];
    
    
    // 实心圆
    [[UIColor cyanColor] set];
    UIBezierPath *path2 = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(55, 335, 10, 10)];
//    [[UIColor redColor] setFill]; // 设置填充颜色,要放在填充之前
    [path2 fill]; // 填充封闭区域,这样就画出了实心圆
    [path2 stroke];
    
    // 实心圆还可以用上面画圆弧的方式画
    
    
    // 椭圆
    [[UIColor magentaColor] set];
    UIBezierPath *path3 = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(120, 300, 120, 80)];
    path3.lineWidth = 5.0f;
    [path3 stroke];
    

    // 矩形
    [[UIColor brownColor] set];
    UIBezierPath *path4 = [UIBezierPath bezierPathWithRect:CGRectMake(260, 300, 60, 100)];
    path4.lineWidth = 3.0f;
    [path4 stroke];


    // 圆角矩形
    [[UIColor brownColor] set];
    UIBezierPath *path5 = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(200, 400, 150, 80) cornerRadius:40];
    path5.lineWidth = 3.0f;
    [path5 stroke];
}

<h4>3、渐变色</h4>

- (void)stroke3{
    
    // 背景的渐变色 CAGradientLayer用于生成渐变图层
    CAGradientLayer *gradientLayer2 = [CAGradientLayer layer];
    gradientLayer2.frame = CGRectMake(50, 400, 100, 200);
    gradientLayer2.colors = @[(__bridge id)[UIColor purpleColor].CGColor, (__bridge id)[UIColor yellowColor].CGColor, (__bridge id)[UIColor magentaColor].CGColor];
    gradientLayer2.locations = @[@0.2, @0.5, @0.8]; // 渐变色的位置分段
    // 起始点决定颜色渐变的方向,x,y的值跟锚点的值所表示的位置相同。
    gradientLayer2.startPoint = CGPointMake(0, 0);
    gradientLayer2.endPoint = CGPointMake(0.0, 1.0);
    [self.layer addSublayer:gradientLayer2];
    
    
    // 弧线的渐变色
    [[UIColor yellowColor] set];
    UIBezierPath *path1 = [UIBezierPath bezierPathWithArcCenter:CGPointMake(90, 90) radius:80 startAngle:-210/180.0*M_PI endAngle:30/180.0*M_PI clockwise:YES];
    CAShapeLayer *shapeLayer1 = [CAShapeLayer layer];
    shapeLayer1.frame = CGRectMake(0, 0, 180, 180); // 这个frame要是相对于下面渐变图层
    shapeLayer1.path = path1.CGPath;
    shapeLayer1.lineWidth = 15.0f;
    shapeLayer1.strokeColor = [UIColor redColor].CGColor;
    shapeLayer1.fillColor = [UIColor clearColor].CGColor;  // 填充色要设为clearColor否则弧线内也会有渐变色
    shapeLayer1.lineCap = kCALineCapRound; // 弧线两端的样式
    
    // 渐变图层
    CAGradientLayer *gradientLayer1 = [CAGradientLayer layer];
    gradientLayer1.frame = CGRectMake(180, 480, 180, 180);
    gradientLayer1.colors = @[(__bridge id)[UIColor purpleColor].CGColor, (__bridge id)[UIColor yellowColor].CGColor, (__bridge id)[UIColor magentaColor].CGColor];
    [gradientLayer1 setLocations:@[@0.0,@0.4,@1.0]];
    [gradientLayer1 setStartPoint:CGPointMake(0, 0)];
    [gradientLayer1 setEndPoint:CGPointMake(1, 0)];
    
    // 用shapLayer1来截取渐变层遮罩
    [gradientLayer1 setMask:shapeLayer1];
    [self.layer addSublayer:gradientLayer1];

    
    
    //下面方法可以以动画的形式划线
//    CABasicAnimation *pathAnimation=[CABasicAnimation animationWithKeyPath:@"strokeEnd"];
//    pathAnimation.duration = 1.0;
//    pathAnimation.timingFunction=[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
//    pathAnimation.fromValue=[NSNumber numberWithFloat:0.0f];
//    pathAnimation.toValue=[NSNumber numberWithFloat:1.0f];
//    pathAnimation.autoreverses=NO;
//    shapeLayer1.path=path1.CGPath;
//    [shapeLayer1 addAnimation:pathAnimation forKey:@"strokeEndAnimation"];
    

}

</br>
</br>
</br>
<h5>没事还是要写点东西来充实自己的。今天刚好读了一篇文章,在此记录一下读后的心得“运气是量变到质变的一个节点,我们不应期待运气,而是要创造运气”。</h5>

相关文章

网友评论

    本文标题:UIBezierPath 贝塞尔曲线的几种基本用法

    本文链接:https://www.haomeiwen.com/subject/yoyofxtx.html