UIBezierPath的使用(持续更新)

简介:

UIBezierPath的使用

1. 使用UIBezierPath绘制多边形

// 获取path
    UIBezierPath *aPath = [UIBezierPath bezierPath];
    
    // 设定起始点
    [aPath moveToPoint:CGPointMake(0.0f, 0.0f)];
    
    // 添加点
    [aPath addLineToPoint:CGPointMake(100.0f, 100.0f)];
    [aPath addLineToPoint:CGPointMake(0.f, 50.f)];
    
    // 闭合path
    [aPath closePath];

2. 使用UIBezierPath绘制圆形

// 将常数转换为度数
    #define   DEGREES(degrees)  ((3.14159265359f * degrees)/ 180.f)
    
    // 获取path
    UIBezierPath *aPath = \
    [UIBezierPath bezierPathWithArcCenter:CGPointMake(50, 50) // 圆的中心
                                   radius:50.f                // 圆的半径
                               startAngle:DEGREES(0)          // 起始点
                                 endAngle:DEGREES(360)        // 结束点
                                clockwise:YES];               // 顺时针

3. 使用UIBezierPath绘制矩形

    // 获取path
    UIBezierPath *aPath = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 100, 100)];

4. 使用UIBezierPath绘制椭圆

    // 获取path
    UIBezierPath *aPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, 50, 70)];

5. 使用UIBezierPath绘制圆角矩形

    // 获取path
    UIBezierPath *aPath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, 100, 100)
                                                     cornerRadius:10.f];

6. 使用UIBezierPath绘制带部分圆角的矩形

    // 获取path
    UIBezierPath *aPath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, 100, 100)
                                                byRoundingCorners:UIRectCornerTopLeft
                                                      cornerRadii:CGSizeMake(100, 100)];

7. 使用UIBezierPath绘制不规则曲线1

// 获取path
    UIBezierPath *aPath = [UIBezierPath bezierPath];
    
    // 设定起始点
    [aPath moveToPoint:CGPointMake(0.0f, 0.0f)];
    
    // 添加一个不规则点
    [aPath addCurveToPoint:CGPointMake(100.f, 100.f)
             controlPoint1:CGPointMake(50.f, 0.f)     // 开始点
             controlPoint2:CGPointMake(0.f, 50.f)];   // 结束点
    
    // 添加一个点
    [aPath addLineToPoint:CGPointMake(0.0f, 100.f)];
    
    // 闭合path
    [aPath closePath];

8. 使用UIBezierPath绘制不规则曲线2

// 获取path
    UIBezierPath *aPath = [UIBezierPath bezierPath];
    
    // 设定起始点
    [aPath moveToPoint:CGPointMake(0.0f, 0.0f)];
    
    // 添加一个不规则点
    [aPath addQuadCurveToPoint:CGPointMake(100.f, 100.f)
                  controlPoint:CGPointMake(0.f, 90.f)];   // 控制点
    
    // 添加一个点
    [aPath addLineToPoint:CGPointMake(0.0f, 100.f)];
    
    // 闭合path
    [aPath closePath];

9. 使用path与CAShapeLayer配合制作mask遮罩效果(path闭环里面的填充区域就是作为遮罩使用的)

// 创建一个view
    UIView *showView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    showView.backgroundColor = [UIColor greenColor];
    showView.layer.contents = (__bridge id)([UIImage imageNamed:@"1"].CGImage);

    // 创建一个椭圆的path
    UIBezierPath *aPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, 100, 100)];

    // 创建一个CAShapeLayer并获取椭圆的path
    CAShapeLayer *layer = [CAShapeLayer layer];
    layer.path = aPath.CGPath;
    
    // 把这个CAShapeLayer添加为mask
    showView.layer.mask = layer;

10. 使用Core Graphics函数去修改path
    UIBezierPath类只是CGPathRef数据类型和path绘图属性的一个封装。虽然通常我 们可以用UIBezierPath类的方法去添加直线段和曲线段,UIBezierPath类还提供了一个属性CGPath,我们可以用来直接修改底层的 path data type。如果我们希望用Core Graphics 框架函数去创建path,则我们要用到此属性。
    有两种方法可以用来修改和UIBezierPath对象相关的path。可以完全的使用Core Graphics函数去修改path,也可以使用Core Graphics函数和UIBezierPath函数混合去修改。第一种方法在某些方面相对来说比较容易。我们可以创建一个CGPathRef数据类型, 并调用我们需要修改path信息的函数。
下面的代码就是赋值一个新的CGPathRef给UIBezierPath对象。
如 果我们使用Core Graphics函数和UIBezierPath函数混合方法,我们必须小心的移动path 信息在两者之间。因为UIBezierPath类拥有自己底层的CGPathRef data type,我们不能简单的检索该类型并直接的修改它。相反,我们应该生成一个副本,然后修改此副本,然后赋值此副本给CGPath属性,如下代码:
Mixing Core Graphics and UIBezierPath calls

 

 
 

目录
相关文章
|
存储 移动开发 JSON
前端面试题汇总大全 -- 持续更新!(一)
前端面试题汇总大全 -- 持续更新!
435 0
|
编译器 C语言 C++
【C/C++】从 C 到 C++ (持续更新)
从 C语言转到 C++ 需要注意的事项
90 1
|
前端开发 JavaScript 容器
2023年前端面试整理(持续更新中)
2023年前端面试整理(持续更新中)
|
存储 缓存 JSON
前端面试题汇总大全 -- 持续更新!(四)
前端面试题汇总大全 -- 持续更新!
104 0
|
移动开发 编解码 前端开发
前端面试题汇总大全 -- 持续更新!(三)
前端面试题汇总大全 -- 持续更新!
89 0
|
存储 缓存 JavaScript
前端面试题汇总大全 -- 持续更新!(二)
前端面试题汇总大全 -- 持续更新!
89 0
|
存储 Linux
疑惑、问题、生疏及解决(持续更新)
疑惑、问题、生疏及解决(持续更新)
131 0
疑惑、问题、生疏及解决(持续更新)
|
安全 数据安全/隐私保护 iOS开发
精品资源汇总:(持续更新)
精品资源汇总:(持续更新)
198 0
精品资源汇总:(持续更新)
|
IDE 程序员 开发工具
C++入门指南(持续更新)
C++入门指南(持续更新)
231 0
C++入门指南(持续更新)
|
消息中间件 安全 Java
关于SolrCore引发的总结--持续更新
假期重新把之前在新浪博客里面的文字梳理了下,搬到这里。本文是SolrCore原理分析的连载之一,介绍SolrCore的原理。理解了org.apache.solr.core.SolrCore也就理解了solr,SolrCore作为solr的一个最小完备管理单元,覆盖了查询、更新、cache、分布式等全部内容。在工程上的 plugin、安全性上的权限、线程安全上的计数、扩展上的加载。。。。如果相关依赖lucene实现自己的分布式,那么SolrCore不能不学习和借鉴。
177 0