How can i push entire view up when keyboard appears?

46 views Asked by At

I have i problem in my app, when I click on Text Field and keyboard appears my view is stunning. enter image description here 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()
                }
            }
    }
}
0

There are 0 answers