iOS SwiftUI 视图的默认布局 视图最好有个顶级容器
·

没有顶级容器的情况下视图效果可能出乎意料,因为当一个视图嵌入另外一个视图的时候,相当于内容直接嵌入,而不是作为一个包装的子视图。
举个例子,TabView的每个子项都被当作一个页面,如果嵌入的页面没有顶级容器,就会展现为多个页面。视图默认是类似VStack的纵向排列,单独看和有顶级VStack效果是一样的。
总入口的代码:
@State var bindingstr = "bindingstr"
var body: some View {
HStack {
Spacer()
VStack {
Spacer()
TabView{
SwiftUIViewEnv(info:$bindingstr)
SwiftUIViewGesture()
SwiftUIViewScroll()
SwiftUIViewPopup()
SwiftUIViewRGB()
SwiftUIViewForm()
Text("You are welcome")
Text("You are welcome")
Text("You are welcome")
}
这是个TabView,有好多页面,我们关注第一个页面,第一个页面的代码:
import SwiftUI
class EnvModel: ObservableObject{
@Published var info = "env"
@AppStorage("setting") var setting = "setting"
}
struct SwiftUIViewEnv: View {
@Binding var info : String
@EnvironmentObject var env: EnvModel
@EnvironmentObject var env2: EnvModel
var body: some View {
//VStack{
Text(info)
Text(env.info)
.onTapGesture {
env.info += "1"
}
Text(env.setting)
.onTapGesture {
env.setting += "1"
}
Text(env2.info)
.onTapGesture {
env2.info += "a"
}
Text(env2.setting)
.onTapGesture {
env2.setting += "a"
}
//}
}
}
#Preview {
var info = "abc"
SwiftUIViewEnv(info: Binding.constant(info)).environmentObject(EnvModel())
}
顶级容器VStack屏蔽了,单独预览效果:

前面的总入口的预览效果:

对应单独预览的第一行“abc”(因为传入的参数不同),滑动到下一页:

再下一页:

很明显,这是因为嵌套页面没有顶级容器造成的。打开顶级VStack容器:

这才是我们想要的效果。
更多推荐
所有评论(0)