Простое фоновое изображение SwiftUI продолжает двигаться при появлении клавиатуры

#swiftui #ios14 #xcode12

#swiftui #ios14 #xcode12

Вопрос:

Это сводит меня с ума. Похоже, в iOS14 появилось новое поведение для обработки фоновых изображений.

Желаемый эффект: фиксированное фоновое изображение, которое заполняет экран, игнорируя безопасные области, и полностью статично, когда появляется клавиатура. Вместо этого клавиатура заставляет изображение скользить вправо, даже если клавиатура поднимается снизу (??).

Это ошибка SwiftUI? Любые идеи / обходные пути приветствуются.

Код для создания этого очень маленький:

 import SwiftUI

struct ContentView: View {
    
    @State var name = "Name"
    
    var body: some View {
        GeometryReader { geometry in
            VStack {
                TextField("Placeholder", text: $name)
            }
            .frame(width: geometry.size.width, height: geometry.size.height)
            .background(
                Image("bricks")
                    .resizable()
                    .scaledToFill()
                    .edgesIgnoringSafeArea(.all)
            )
        }
    }
}
  

Ответ №1:

Хорошо, получается, что добавление .frame вызова следующим образом позволяет отображать фоновое изображение по желанию.

(Обратите особое внимание, что .frame вызов опускает height аргумент. Во многих предыдущих попытках решить эту проблему была включена высота, что приводило к другому нежелательному поведению)

 .background(
    Image("bricks")
        .resizable()
        .scaledToFill()
        .frame(width: geometry.size.width)
        .edgesIgnoringSafeArea(.all)
)
  

Ответ №2:

Для меня это сработало, когда я обернул фоновое изображение внутри a GeometryReader , которое игнорирует безопасную область следующим образом:

 GeometryReader { geo in
    Image(uiImage: Backgrounds.chalk)
        .resizable(resizingMode: .tile)
        .scaledToFill()
        .frame(width: geo.size.width, height: geo.size.height)
}
.edgesIgnoringSafeArea(.all)
  

Ответ №3:

Это работа для меня:

 .background(
                Image("bricks")
                    .resizable()
                    .scaledToFill()
                    .frame(width: geometry.size.width)
                    
            )
.edgesIgnoringSafeArea(.all)