SwiftUI останавливает вертикальное расширение делителя в HStack - PullRequest
1 голос
/ 08 апреля 2020

Я использую SwiftUI для создания чего-то вроде всплывающего окна с предупреждением, которое я представляю из кода UIKit, используя UIHostingController. Представление выглядит так:

VStack(spacing: 0) {
    // Some text ...   

    HStack(spacing:0) {
        Button(action: self.onCancel) { Text("Cancel") }
           .padding().inExpandingRectangle().fixedSize(horizontal: false, vertical: true)

        // This divider is the problem
        Divider() // .fixedSize()

        Button(action: self.onDelete) {  Text("Delete") }
           .padding().inExpandingRectangle().fixedSize(horizontal: false, vertical: true)
    }
}.frame(minHeight: 0)

inExpandingRectangle - это то, что я нашел в другом вопросе stackoverflow. Он центрирует текст с каждой стороны HStack.

extension View {
    func inExpandingRectangle() -> some View {
        ZStack {
            Rectangle().fill(Color.clear)
            self
        }
    }
}

Это выглядит так. Мусор.

enter image description here

Если я положу .fixedSize() на разделитель, он сделает это. Не ужасно, но разделитель выглядит глупо и не расширяется до размера кнопок.

enter image description here

Ответы [ 3 ]

1 голос
/ 08 апреля 2020

Вот демонстрация возможных упрощенных альтернатив, без этого искусственного расширения. Протестировано с Xcode 11.4 / iOS 13.4.

demo

Divider() // or Rectangle().fill(Color.gray).frame(height: 1)
HStack {
    Button(action: {}) { Text("Cancel").fixedSize() }
        .padding().frame(maxWidth: .infinity)

    Divider() // or Rectangle().fill(Color.gray).frame(width: 1)

    Button(action: {}) {  Text("Delete").fixedSize() }
        .padding().frame(maxWidth: .infinity)

}.fixedSize(horizontal: false, vertical: true)

Примечание: Стоит также учитывать нестандартный делитель, как

Rectangle().fill(Color.gray).frame(width: 1) // or any other color

, что может дать очень соответствующую визуальную обратную связь, например

demo2

1 голос
/ 08 апреля 2020

Установка fixedSize() вместо Divider модификатора *1001* устраняет проблему.

    var body : some View {
        VStack(spacing: 0) {
            // Some text ...
            Text("gsfdsfkajflkasdjflkas,jdflaskjf")
            HStack(spacing:0) {
                Button(action: {print("hi")}) { Text("Cancel") }
                    .padding().inExpandingRectangle().fixedSize(horizontal: true, vertical: true)

                // This divider is the problem
                Divider()


                Button(action: {print("hello")}) {  Text("Delete") }
                    .padding().inExpandingRectangle().fixedSize(horizontal: true, vertical: true)
            }.fixedSize()        <------- Insert this
        }.frame(minHeight: 0)
    }

Результат:

enter image description here

0 голосов
/ 08 апреля 2020

Вы можете попробовать следующий код, надеюсь, он вам поможет (Xcode 11.2.1)

Примечание : измените Font, Frame и Color согласно вашему требованию

var body: some View {

    VStack(spacing: 0) {

        Text("Delete")
            .font(Font.system(size: 20, weight: .bold))

        Text("Are you sure you want to delete ?")
            .font(Font.system(size: 18, weight: .regular))
            .padding([.top,.bottom], 15)

        Rectangle().fill(Color.gray.opacity(0.5)).frame(height:0.5)

        HStack(spacing:0) {

            Button(action: {
                //Your action
            }) {
                Text("Cancel")
                    .foregroundColor(Color.black)
                    .font(Font.system(size: 18, weight: .medium))
            }
            .frame(minWidth: 150, maxWidth: .infinity, minHeight: 40, maxHeight: 40, alignment: .center)

            Rectangle().fill(Color.gray.opacity(0.5)).frame(width:0.5,height:20)

            Button(action: {
                //Your action
            }) {
                Text("Delete")
                    .font(Font.system(size: 18, weight: .medium))
                    .foregroundColor(Color.red)
            }
            .frame(minWidth: 150, maxWidth: .infinity, minHeight: 40, maxHeight: 40, alignment: .center)
        }
    }
}

Выход:

enter image description here

...