那么,如果想要Canvas
知道已解析符号的大小(边界框),例如,相对于其他符号或直接绘制到其中的路径的放置,通过检查GraphicsContext.ResolvedSymbol.size属性是不可能的吗?
这令人惊讶。不是我想做的事情的障碍,但想了解为什么会出现这种特殊行为(如果有人知道并可以解释的话)?
下面重现了关于切换按钮输出的简单示例
canvas size: (400.0, 350.0); symbol size: (400.0, 350.0)
toggled
canvas size: (500.0, 450.0); symbol size: (500.0, 450.0)
toggled
canvas size: (400.0, 350.0); symbol size: (400.0, 350.0)
struct ContentView: View {
@State private var large = false
var body: some View {
VStack {
Button {
large.toggle()
print("toggled")
} label: {
Text("Toggle Size")
}
Spacer()
Canvas { context, size in
let s0 = context.resolveSymbol(id: 0)!
print("canvas size: \(size); symbol size: \(s0.size)")
context.draw(s0, in: CGRect(origin: .zero, size: size))
} symbols: {
Path(ellipseIn: CGRect(origin: .zero, size: CGSize(width: 300, height: 300)))
.stroke(.green, lineWidth: 10)
.border(.blue)
.tag(0)
}
.frame(width: large ? 500 : 400, height: large ? 450 : 350)
}.padding()
}
}
我认为当您解析符号并检查其大小时,您看到的是的边界矩形
Path
,即:(参考路径文档)。
因此,当以这种方式创建符号时,边界矩形似乎使用了所有可用空间。
.frame
您可以通过将修改器应用于 来将其限制为与椭圆相同的大小Path
:作为记录,这里是原始问题的修改代码,说明了Benzy Neez提供的答案。
第一个
.draw
是未经修改的原始“圆”,第二个是缩放以适应视图Canvas
。