我有一段简单的代码,可以在视图中绘制路径,如下所示:
import SwiftUI
struct ContentView: View {
var body: some View {
GeometryReader { proxy in
Color.yellow
let proxyCGRect: CGRect = proxy.frame(in: .local)
let dy = rectPath1.boundingRect.midY
// way 1 with offsetBy:
rectPath1
.offsetBy(dx: .zero, dy: .zero)
.fill(Color.blue)
// way 2 with position:
rectPath2
.fill(Color.red)
.position(x: 0, y: 0)
// way 3 with offset:
rectPath3
.fill(Color.green)
.offset(x: 0, y: 0)
}
}
}
func createRectPath(for rect: CGRect) -> Path {
var path = Path()
path.addRect(rect)
return path
}
let rectPath1: Path = createRectPath(for: CGRect(x: 50, y: 50, width: 50, height: 100))
let rectPath2: Path = createRectPath(for: CGRect(x: 200, y: 100, width: 100, height: 100))
let rectPath3: Path = createRectPath(for: CGRect(x: 400, y: 300, width: 100, height: 100))
在视图中我们得到了要绘制的路径,我想将 SwiftUI 坐标系(如照片中所示)从黑色更改为蓝色。在 x 轴上,它会相同,但 y 轴会发生变化。我想制作一个函数,使用路径信息来绘制相同的东西,但在其他坐标系中,我们该怎么做?只需知道一件事,我们确实可以访问路径,而不是 cgrect!因为这个路径可以是任何形状,所以它不固定为 addRect,它是任何路径,但我们可以访问路径,并且可以使用它。
当我在运行 iOS 18.1 的 iPhone 16 模拟器上尝试您的示例代码时,我只看到一个带有黄色背景的蓝色矩形覆盖了安全区域插入内的屏幕区域。
也许值得尝试去理解为什么红色和绿色矩形没有显示。让我们尝试使用红色矩形进行不同的测试:
这表明:
我们看到的是:
在您的原始示例中,您设置了
.position(x: 0, y: 0)
红色矩形。这会将视图的中心移动到父级坐标空间中的新坐标。这意味着,黑点将移动到蓝色框架左上角所示的位置,红色矩形将从屏幕上消失。回到你最初的问题,如果你想要 y 坐标从坐标空间的底部而不是顶部开始,你只需要通过应用来翻转整个形状
.scale(y: -1)
。顺便说一句,
.scale
是 的一个函数Shape
,它返回 aScaledShape
- 参见scale(x:y:anchor:)。由于 aScaledShape
也是Shape
,因此您仍然可以对结果应用其他形状操作,例如。如果改用修饰符.fill
,则这是不可能的,因为视图修饰符返回。View
.scaleEffect
some View
对上面相同的例子尝试一下:
那么这就是您所追求的吗,或者您心中有其他类型的转变?