You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何直接用CGRect创建CGPath?CGPath初始化中UnsafePointer使用疑问

直接用CGRect创建CGPath的方法详解

当然可以直接使用CGRect通过CGPath的初始化方法来创建路径,和你当前用UIBezierPath中转的方式效果完全一致,甚至在不需要额外贝塞尔路径功能的情况下更直接。下面我会详细解释这个初始化方法的用法,并给出对应示例:


核心结论:无变换场景下直接传nil即可

你当前的代码是通过UIBezierPath(rect: rect).cgPath获取矩形路径,本质上UIBezierPath的这个初始化方法内部就是调用了CGPath的矩形创建逻辑,且没有应用任何变换。所以直接用CGPath(rect:transform:)并传入nil作为变换参数,就能得到完全相同的路径:

let dirX = -spread 
let rect = bounds.insetBy(dx: dirX, dy: dirX) 
// 直接创建CGPath,无需UIBezierPath中转
let cgPathDirect = CGPath(rect: rect, transform: nil)

这段代码和你原来的代码生成的CGPath是完全等价的,没有任何差异。


关于UnsafePointer<CGAffineTransform>参数的用法

这个参数的作用是让你在创建矩形路径时直接应用一个仿射变换(比如平移、旋转、缩放)。UnsafePointer在这里只是用来传递CGAffineTransform的内存地址,Swift提供了几种安全的方式来处理它:

1. 不需要变换时:传nil

如上面的示例,当你不需要对矩形做任何变换时,直接传nil就可以,这也是最常用的场景。

2. 需要应用变换时:安全传递指针

如果你想给矩形路径加上变换效果(比如把矩形向右平移10pt、顺时针旋转30度),可以通过withUnsafePointer(to:)方法安全获取变换的指针:

let dirX = -spread 
let rect = bounds.insetBy(dx: dirX, dy: dirX)

// 创建一个平移变换:向右10pt,向下10pt
let translationTransform = CGAffineTransform(translationX: 10, y: 10)
// 创建一个旋转变换:顺时针旋转30度(注意要转成弧度)
let rotationTransform = CGAffineTransform(rotationAngle: .pi / 6)
// 组合多个变换
let combinedTransform = translationTransform.concatenating(rotationTransform)

// 安全传递变换指针,创建带变换的CGPath
let cgPathWithTransform = withUnsafePointer(to: combinedTransform) {
    CGPath(rect: rect, transform: $0)
}

你也可以直接用&符号传递变换变量(Swift会自动处理指针转换),不过withUnsafePointer的方式更明确,也更符合Swift的安全内存规范:

// 简洁写法,效果和上面一致
let cgPathWithTransform = CGPath(rect: rect, transform: &combinedTransform)

两种方式的对比

  • 用UIBezierPath中转的方式更适合后续需要对路径做贝塞尔曲线编辑(比如添加控制点、拼接路径)的场景;
  • 直接用CGPath(rect:transform:)的方式更轻量,不需要额外创建UIBezierPath实例,适合只需要基础矩形路径的场景。

无论哪种方式,最终生成的CGPath在无变换的情况下是完全相同的。

内容的提问来源于stack exchange,提问作者daredevil1234

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:00:36