SwifUI Zstack не работает на нескольких устройствах

У меня есть такой код:

struct ContentView: View {
    var body: some View {
        ZStack {
            Image("bird")
                .resizable()
                .aspectRatio(contentMode: .fill)
                .edgesIgnoringSafeArea(.all)
            Image(systemName: "camera.on.rectangle")
                .offset(x: 160, y: -380)
                .font(.largeTitle)
            Image(systemName: "heart")
                .offset(x: -160, y: 380)
                .font(.largeTitle)
                .foregroundColor(.red)
            Image(systemName: "square.and.arrow.up.on.square")
                .offset(x: -160, y: -380)
                .font(.largeTitle)
        }
    }
}

Я использую .offset, чтобы установить конкретное место для изображений. Но когда я перехожу на другой формат устройства, они уходят. Есть ли способ наложить ограничения или улучшить этот код для правильной работы в SwiftUI?

Благодарю.

1 ответ

В SwiftUI вы можете использовать модификатор AlignmentGuide вместе с GeometryReader для создания более гибких макетов, адаптирующихся к различным размерам устройств. Это позволяет вам определять ограничения и выравнивание для ваших представлений.

      struct ContentView: View {
    var body: some View {
        ZStack(alignment: .topLeading) {
            GeometryReader { geometry in
                Image("bird")
                    .resizable()
                    .aspectRatio(contentMode: .fill)
                    .frame(width: geometry.size.width, height: geometry.size.height)
                    .edgesIgnoringSafeArea(.all)
                
                VStack {
                    Image(systemName: "camera.on.rectangle")
                        .font(.largeTitle)
                        .alignmentGuide(.topLeading) { d in d[.top] + d[.height] / 2 }
                    Spacer()
                    Image(systemName: "heart")
                        .font(.largeTitle)
                        .foregroundColor(.red)
                        .alignmentGuide(.bottomTrailing) { d in d[.bottom] - d[.height] / 2 }
                }
                
                Image(systemName: "square.and.arrow.up.on.square")
                    .font(.largeTitle)
                    .alignmentGuide(.bottomLeading) { d in d[.bottom] - d[.height] / 2 }
            }
        }
    }
}

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

Другие вопросы по тегам