Вертикальное центрирование текста в Swift UI - PullRequest
0 голосов
/ 01 октября 2019

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 ]

2 голосов
/ 01 октября 2019

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 голос
/ 01 октября 2019

Как мы уже говорили выше, вам не нужен ScrollView, поэтому вы можете написать .navigationBarTitle("Test") внутри NavigationView. Так что NavigationBarTitle и Text("$0.00") оба будут отображаться на вашем экране.

Здесь я помещаю статическое значение текста, вы можете заменить его динамическим значением, которое вы устанавливаете из вашей модели.

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")
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...