Как сделать ширину просмотра равной superview с помощью swiftUI - PullRequest
3 голосов
/ 08 июня 2019

У меня есть Button enter image description here

struct ContentView : View {
var body: some View {
    HStack {
        Button(action: {}) {
            Text("MyButton")
                .color(.white)
                .font(Font.system(size: 17))
        }
        .frame(height: 56)
        .background(Color.red, cornerRadius: 0)
    }
}
}

Но я хочу прикрепить его к краям supreview (трейлинг к трейлингу и вождению superview).Вот так:

enter image description here

HStack не помогает мне, и он ожидает.Фиксированный frame или ширина, равная UIScree.size, не являются гибкими решениями.

Ответы [ 3 ]

7 голосов
/ 08 июня 2019

Вы можете использовать GeometryReader: https://developer.apple.com/documentation/swiftui/geometryreader

Согласно Apple:

Это представление возвращает гибкий предпочтительный размер для родительского макета.

enter image description here

Это гибкое решение, так как оно изменяется в соответствии с изменениями родительского макета.

5 голосов
/ 08 июня 2019

Вам необходимо использовать .frame(minWidth: 0, maxWidth: .infinity) модификатор

Добавить следующий код

        Button(action: tap) {
            Text("Button")
                .frame(minWidth: 0, maxWidth: .infinity)
                .background(Color.red)
        }
        .padding([.leading, .trailing], 20)

Модификатор отступа позволит вам иметь некоторое пространство от края.

Имейте в виду, что порядок модификаторов важен . Поскольку модификаторы на самом деле являются функциями, которые обертывают представление ниже (они не изменяют свойства представлений)

1 голос
/ 08 июня 2019

Я нашел одно решение:

var body: some View {
    Button(action: {}) {
            HStack {
                Spacer()
                Text("MyButton")
                    .color(.white)
                    .font(Font.system(size: 17))
                Spacer()
            }
            .frame(height: 56)
            .background(Color.red, cornerRadius: 0)
        }.padding(20)
}

Но я не уверен, что оно лучшее.Может быть, кто-то найдет более элегантное решение /

...