Swift用UIBezierPath来画圆角矩形、自定义多路径图形

最好的特点就是可以自定义路径,设置圆角和描边都很方便,以下为代码和效果,均在playground中实现

1、首先实现一个圆角矩形,并对此路径描边,为其绘制一个轮廓。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//: Playground - noun: a place where people can play
 
import UIKit
 
class MyView : UIView{
    override func drawRect(rect: CGRect) {
        var pathRect = UIEdgeInsetsInsetRect(self.bounds, UIEdgeInsetsMake(1, 1, 1, 1))
         
        var path = UIBezierPath(roundedRect: pathRect, cornerRadius: 10)
         
        path.lineWidth = 4
         
        UIColor.greenColor().setFill()
        UIColor.blackColor().setStroke()
        path.fill()
        path.stroke()
    }
}
 
let viewRect = CGRect(x: 0, y: 0, width: 100, height: 100)
let myEmptyView = MyView(frame:viewRect)

  

tips:所有绘制操作都是按照调用顺序进行的。在本段代码中,我在填充矩形后再对其进行描边。如果交换对path.fill()和path.stroke()的调用顺序,将会得到一个稍有不同的结果,绿色填充将会略微覆盖黑色描边,效果图如下。

 

2、下面自定义一条路径,确定几个点,然后像画笔一样连线!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//: Playground - noun: a place where people can play
 
import UIKit
 
class MyView : UIView{
    override func drawRect(rect: CGRect) {
        var bezierPath = UIBezierPath()
        //创建一个矩形,它的所有边都内缩5%
        var drawingRect = CGRectInset(self.bounds, self.bounds.size.width*0.05, self.bounds.size.height*0.05)
         
        //确定组成绘画的点
        var topLeft = CGPointMake(CGRectGetMinX(drawingRect), CGRectGetMinY(drawingRect))
        var topRight = CGPointMake(CGRectGetMaxX(drawingRect), CGRectGetMinY(drawingRect))
        var bottomLeft = CGPointMake(CGRectGetMinX(drawingRect), CGRectGetMaxY(drawingRect))
        var bottomRight = CGPointMake(CGRectGetMaxX(drawingRect), CGRectGetMaxY(drawingRect))
        var center = CGPointMake(CGRectGetMidX(drawingRect), CGRectGetMinY(drawingRect))
         
        //开始绘制
        bezierPath.moveToPoint(topLeft)
        bezierPath.addLineToPoint(topRight)
        bezierPath.addLineToPoint(bottomLeft)
        bezierPath.addCurveToPoint(bottomRight, controlPoint1: center, controlPoint2: center)
         
        //使路径闭合,结束绘制
        bezierPath.closePath()
         
        //设定颜色,并绘制它们
        UIColor.redColor().setFill()
        UIColor.blackColor().setStroke()
         
        bezierPath.fill()
        bezierPath.stroke()
    }
}
 
let viewRect = CGRect(x: 0, y: 0, width: 100, height: 100)
let myEmptyView = MyView(frame:viewRect)

 

3、多条子路径也可以。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//: Playground - noun: a place where people can play
 
import UIKit
 
class MyView : UIView{
    override func drawRect(rect: CGRect) {
        //创建一条空Bezier路径
        let bezierPath = UIBezierPath()
         
        //为两个组成部分定义矩形
        let squareRect = CGRectInset(rect, rect.size.width*0.45, rect.size.height*0.05)
         
        let circleRect = CGRectInset(rect, rect.size.width*0.3, rect.size.height*0.3)
         
        let cornerRadius : CGFloat = 20
         
        //创建路径
        let circlePath = UIBezierPath(ovalInRect: circleRect)
        let squarePath = UIBezierPath(roundedRect: squareRect, cornerRadius: cornerRadius)
         
        //将它们添加到主路径
        squarePath.appendPath(circlePath)
        bezierPath.appendPath(squarePath)
         
        //设定颜色并绘制它们
        UIColor.redColor().setFill()
         
        //绘制路径
        bezierPath.fill()
    }
}
 
let viewRect = CGRect(x: 0, y: 0, width: 100, height: 100)
let myEmptyView = MyView(frame:viewRect)

  

以上就是UIBezierPath的基本用法,用好了将是绘制图形的又一利器。

posted @   brave-sailor  阅读(618)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
历史上的今天:
2015-10-14 最简单也最难——如何获取到Android控件的高度
2015-10-14 Android新增API之AudioEffect中文API与应用实例
2013-10-14 Android之动态改变控件大小
2013-10-14 android适配各种分辨率的问题
点击右上角即可分享
微信分享提示