6 swiftui
我有以下代码:
var body: some View {
VStack {
contentView
.padding()
ToolBarView()
.padding()
}
}
Run Code Online (Sandbox Code Playgroud)
我注意到,如果我删除VStack
,代码仍然有效。这很奇怪。它们相等吗?这里隐式使用了吗VStack
?如果我保留这个VStack
,是否意味着 SwiftUI 将生成重复的嵌套VStack
?
编辑:
是contentView
:
var contentView: some View {
let state = stateObservable.state
if state.isResultPage {
return AnyView(ResultContentView())
} else {
return AnyView(JokeContentView())
}
}
Run Code Online (Sandbox Code Playgroud)
rob*_*off 10
为了避免需要定义 a ToolBarView
,我将使用此示例而不是您的示例:
struct MyView: View {\n var body: some View {\n Text("first")\n Text("second")\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n那么,返回的实际类型是什么MyView().body
?让我们问斯威夫特:
; xcrun swift\nWelcome to Swift version 5.5.2-dev.\nType :help for assistance.\n 1> import SwiftUI\n 2> struct MyView: View { \n 3. var body: some View { \n 4. Text("first") \n 5. Text("second") \n 6. } \n 7. }\n 8> print(type(of: MyView().body))\nTupleView<(Text, Text)>\n
Run Code Online (Sandbox Code Playgroud)\n它是TupleView<(Text, Text)>
。那么 a 到底是什么TupleView
?文档说它是
\n\n从视图值的快速元组创建的视图。
\n
\xe2\x80\xa6这并没有真正解释太多。请允许我解释一下TupleView
到底是什么。
SwiftUI 用于TupleView
表示视图的集合,而不对它们强加任何特定的布局。布局完全由 的容器TupleView
(或者在本例中为MyView
)决定。如果您总是想要垂直布局,则需要VStack
显式使用。如果您希望容器选择布局,请不要使用VStack
.
如果我们将 放入MyView
a 中VStack
,我们会得到一个垂直布局。
PlaygroundPage.current.setLiveView(VStack {\n MyView()\n})\n
Run Code Online (Sandbox Code Playgroud)\n结果:
\n\n但如果我们把 放在MyView
an 中HStack
,我们就会得到一个水平布局。
PlaygroundPage.current.setLiveView(HStack {\n MyView()\n})\n
Run Code Online (Sandbox Code Playgroud)\n结果:
\n\n或者我们可以MyView
在 a 中ControlGroup
获得不同的水平布局:
PlaygroundPage.current.setLiveView(ControlGroup {\n MyView()\n})\n
Run Code Online (Sandbox Code Playgroud)\n结果:
\n\n如果我们把MyView
a 放在里面ZStack
,Text
s 就会被覆盖。
PlaygroundPage.current.setLiveView(ZStack {\n MyView()\n})\n
Run Code Online (Sandbox Code Playgroud)\n结果:
\n\n如果我们把MyView
a 放在里面GeometryReader
,Text
s 就会再次被覆盖。
PlaygroundPage.current.setLiveView(GeometryReader { proxy in\n MyView()\n}.frame(width: 100, height: 100))\n
Run Code Online (Sandbox Code Playgroud)\n结果:
\n\n如果我们用作MyView
a 的主体PreviewProvider
,那么我们会得到两个完全独立的预览。
struct MyView_Previews: PreviewProvider {\n static var previews: some View {\n MyView()\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n结果:
\n\n 归档时间: |
|
查看次数: |
531 次 |
最近记录: |