SwiftUI GeometryReader не размещает пользовательские подпредставления в центре - PullRequest
2 голосов
/ 24 февраля 2020

У меня есть пользовательское представление:

struct ImageContent: View {
    var body: some View {
        Image("smile")
            .resizable()
            .scaledToFit()
    }
}

, которое помещается в другое представление с GeometryReader:

var body: some View {
    GeometryReader { geometry in
        ImageContent()
        //Image("smile").resizable().scaledToFit()
    }
}

Проблема в том, что представление ImageContent не по центру экрана, он размещается сверху, однако, удалив подпредставление ImageContent и непосредственно добавив содержимое вида в считыватель геометрии, исправим проблему (см. рисунок).

Кроме того, удаление GeometryReader также может решить проблему.

Мне нужно подпредставление, потому что я буду реализовывать некоторые дополнительные логи c, а также нужен GeometryReader, потому что добавлен жест к Image, который его использует.

Есть идеи?

Screenshot

Ответы [ 3 ]

0 голосов
/ 24 февраля 2020

для чего вам нужен GeometryReader, если вы не используете предоставленные значения GeometryProxy?

struct ContentView: View {
    var body: some View {
        GeometryReader { geometry in
            ImageContent()
                .position(x: geometry.size.width / 2, y: geometry.size.height / 2)
        }
    }
}

определит точное положение на основе предоставленного значения

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

Я не уверен, почему это происходит, но вы можете использовать то, что предложили другие, или использовать кадр midX и midY из GeometryProxy. Как следующее:

var body: some View {
    GeometryReader { geometry in
        ImageContent()
        .position(x: geometry.frame(in: .local).midX, y: geometry.frame(in: .local).midY)
    }
}
0 голосов
/ 24 февраля 2020

Попробуйте следующее (встроенный контейнер по умолчанию расширен до размера GeometryReader и имеет явное выравнивание по умолчанию, установленное по центру по обоим измерениям). Протестировано с Xcode 11.2.

var body: some View {
    GeometryReader { geometry in
       VStack { // explicit container with center default alignment
        ImageContent()
       }
    }
}
...