Как я могу получить SwiftUI View, чтобы полностью заполнить его суперпредставление? - PullRequest
0 голосов
/ 28 июня 2019

Ниже приведено предполагается для создания Text, границы которого занимают весь экран, но, похоже, ничего не делает.

struct ContentView: View {
    var body: some View {
        Text("foo")
            .relativeSize(width: 1.0, height: 1.0)
            .background(Color.red)
    }
}

Следующий хак:

extension View {
    /// Causes the view to fill into its superview.
    public func _fill(alignment: Alignment = .center) -> some View {
        GeometryReader { geometry in
            return self.frame(
                width: geometry.size.width,
                height: geometry.size.height,
                alignment: alignment
            )
        }
    }
}

struct ContentView2: View {
    var body: some View {
        Text("foo")
            ._fill()
            .background(Color.red)
    }
}

похоже работает, однако.

Это ошибка SwiftUI с relativeSize, или я что-то упустил?

1 Ответ

2 голосов
/ 29 июня 2019

Вам нужно посмотреть WWDC 2019 Сессия 237. Создание пользовательских представлений с помощью SwiftUI , потому что Дейв Абрахамс обсуждает эту тему и использует Text в своих примерах.

Для краткого изложения, чтоДейв подробно объясняет:

  1. Родитель (в данном случае это корневое представление, созданное системой и заполняющее экран), предлагает размер своему дочернему элементу.
  2. child выбирает собственный размер , потребляя столько или меньше предлагаемого размера, сколько ему нужно.
  3. Родитель размещает дочерний элемент в координатном пространстве родителя на основе различных параметров, включая размер, выбранный дочерним элементом..

Таким образом, вы не можете заставить маленький Text заполнить экран, потому что Text откажется использовать больше места, чем необходимо для его содержимого.

Если выЕсли вы хотите, чтобы красный фон заполнил весь экран, вы можете обернуть Text в расширяемый вид, принудительно развернуть расширяемый вид до полного размера и установить фон расширяемого вида.Это работает:

var body: some View {
    ZStack {
        Spacer()
        Text("Hello")
        }
        .background(Color.red)
}

Spacer принимает любой размер, предлагаемый его родителем, поэтому ZStack не может уменьшиться до размера только Text.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...