I have i problem in my app, when I click on Text Field and keyboard appears my view is stunning.
I want to push my entire view up when keyboard appear, but i don't know how to do this.
I tried method from link below but it's wont work well in my view:
https://www.vadimbulavin.com/how-to-move-swiftui-view-when-keyboard-covers-text-field/
code: This is my custom sheet
Custom Sheet:
import SwiftUI
import Design
import Utilities
public struct CustomSheet<Item: Hashable, Content: View>: View {
private let size: CGSize
private var item: Binding<Item?>
private var content: (Item) -> Content
public init(
size: CGSize,
item: Binding<Item?>,
@ViewBuilder content: @escaping (Item) -> Content
) {
self.size = size
self.item = item
self.content = content
}
public var body: some View {
ZStack(alignment: .bottom) {
background
VStack(spacing: 30) {
Button {
withAnimation {
item.wrappedValue = nil
}
} label: {
Image(systemName: "xmark")
.tint(Colors.jaffa)
}
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topTrailing)
.padding(20)
if let item = item.wrappedValue {
content(item)
}
}
.padding(.horizontal)
.frame(width: size.width, height: size.height * 0.55)
.background {
RoundedRectangle(cornerRadius: 50)
.fill(Colors.white)
.edgesIgnoringSafeArea(.bottom)
}
.offset(y: (item.wrappedValue != nil) ? size.height * 0 : size.height * 1)
}
}
}
extension CustomSheet {
private var background: some View {
Rectangle()
.fill(.ultraThinMaterial)
.ignoresSafeArea()
.opacity((item.wrappedValue != nil) ? 1 : 0)
}
}
view where I use this sheet
import Components
import Localizations
import SwiftUI
import Utilities
public struct MainLaunchView: View {
@StateObject private var viewModel = MainLaunchViewModel()
@State private var selectedSegment: SegmentedControlViewModel.SelectedItem = .login
public init() { }
public var body: some View {
GeometryReader { reader in
ZStack {
buildView(for: selectedSegment)
SegmentedControl(selectedItem: $selectedSegment) { item in
selectedSegment = item
}
.padding(30)
.ignoresSafeArea(.keyboard)
buildSheet(size: reader.size)
}
.onReceive(viewModel.$error) { error in
if error != nil {
print("Received error: \(error?.localizedDescription ?? "unknown error")")
viewModel.showAlertToggle()
}
}
.withErrorHandler(
errorMessage: viewModel.error?.localizedDescription ?? "",
errorMessageToggle: $viewModel.showAlert
)
.environmentObject(viewModel)
}
}
@ViewBuilder
private func buildView(for view: SegmentedControlViewModel.SelectedItem) -> some View {
switch view {
case .register:
RegisterView()
case .login:
LoginView()
}
}
}
#Preview {
MainLaunchView()
}
extension MainLaunchView {
@ViewBuilder
private func buildSheet(size: CGSize) -> some View {
CustomSheet(
size: size,
item: $viewModel.activeSheet) { sheet in
switch sheet {
case .passwordRecovery:
PasswordRecoveryView()
}
}
}
}