使用以下内容
@main
struct aspectratioApp: App {
var body: some Scene {
WindowGroup { ContentView().border(.blue, width: 2).padding() }
}
}
并且ContentView
没有aspectRatio
应用修饰符(见下文),结果符合预期,包括Canvas
填充可用空间(我认为这是默认行为),输出canvas size: (243.0, 78.0)
到控制台:
接下来,让我们应用.aspectRatio(isSquare ? 1 : nil, contentMode: isSquare ? .fit : .fill)
修饰符,我认为修饰符的意思是制作Canvas
一个适合的正方形或任何填充可用空间的东西(参见下面带有aspectRatio的ContentView)。从一开始我就得到了一个正方形,Canvas
如下所示:
控制台中会打印一个方形画布大小。切换后,isSquare
画布会保持方形,尺寸会略小一些:
canvas size: (157.0, 157.0)
canvas size: (130.0, 130.0)
我这里漏掉了什么? aspectRatio的文档将aspectRatio 参数记录如下:结果视图使用的宽高比。使用 nil 可在结果视图中保持当前的宽高比。我理解的意思是,如果不应用修饰符,则比例将是原来的。
这不是它的工作原理吗?修改器不是无状态的吗?也就是说,它是否记得画布曾经是正方形,并且现在一直保持这种状态,包括重新启动应用程序?
没有aspectRatio的ContentView
struct ContentView: View {
@State private var isSquare = false
var body: some View {
VStack {
Text("isSquare: \(isSquare)").padding()
Canvas { _, size in print("canvas size: \(size)") }
.border(.teal, width: 2)
.padding()
Toggle(isOn: $isSquare) { Text("Constrain to Square") }.padding()
}
.border(.yellow, width: 2)
.padding()
}
}
带有aspectRatio的ContentView
struct ContentView: View {
@State private var isSquare = false
var body: some View {
VStack {
Text("isSquare: \(isSquare)").padding()
Canvas { _, size in print("canvas size: \(size)") }
.aspectRatio(isSquare ? 1 : nil, contentMode: isSquare ? .fit : .fill)
.border(.teal, width: 2)
.padding()
Toggle(isOn: $isSquare) { Text("Constrain to Square") }.padding()
}
.border(.yellow, width: 2)
.padding()
}
}