在Swift UI中将文字垂直居中

时间:2019-10-01 14:47:45

标签: swiftui

enter image description here

我希望“ $ 0.00”出现在屏幕中间,但我不知道该怎么做。

这是我的代码:

    var body: some View {
    NavigationView {
        ScrollView {
            VStack(alignment: .center) {
                Text(String(format: "$%.2f", (dolaresVM.dolares.last?.v)!))
                    .font(.largeTitle)
            }.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
            .edgesIgnoringSafeArea(.all)



        }.navigationBarTitle("Test")
            .onAppear(perform: self.dolaresVM.fetchDolares)
    }
}

我在做什么错了?

2 个答案:

答案 0 :(得分:2)

ScrollView为其子元素具有无限的内部空间。 VStack无法占用所有这些空间。因此VStack的高度由其内容(在我们的示例中为Text)定义。 如果没有ScrollView,它将如您所愿地工作:

       var body: some View {
        NavigationView {
            VStack(alignment: .center) {
                Text(String(format: "$%.2f", 0)).font(.largeTitle)
            }.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
            .edgesIgnoringSafeArea(.all)
            .navigationBarTitle("Test")
        }
    }

idealHeight提供VStack也可能会有所帮助。您可以使用GeometryReader来获取ScrollView的“外部”高度:

        NavigationView {
            GeometryReader { geometry in
                ScrollView {
                    VStack(alignment: .center) {
                        Text(String(format: "$%.2f", 0)).font(.largeTitle)
                    }.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, idealHeight: geometry.size.height, maxHeight: .infinity)
                        .edgesIgnoringSafeArea(.all)
                }.navigationBarTitle("Test")
            }
        }

答案 1 :(得分:1)

如上所述,您不需要ScrollView,因此可以在.navigationBarTitle("Test")内编写NavigationView。这样NavigationBarTitleText("$0.00")都将显示在屏幕上。

这里我输入了Text的静态值,您可以将其替换为您从Model设置的动态值。

struct ContentView: View {
    var body: some View {

        NavigationView {

            VStack(alignment: .center) {
                Text("$0.00")
                    .font(.largeTitle)
            }
            .frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
            .edgesIgnoringSafeArea(.all)
            .navigationBarTitle("Test")
        }
    }
}