SwiftUI Searchbar pushed off screen by keyboard

Viewed 80

I have implemented a searchbar that filters a list. However when the keyboard appears it pushes the searchbar right off the screen. I have tried using .ignoresSafeArea(.keyboard) however it will not work (I have tried placing it in many different spots). I would like to make it so the view/list does not move at all when the keyboard appears.

I am displaying this view below after pressing a button

        //MARK: - ActivitySelectorView
        ActivitySelectorView(showActivitySelector: $showActivitySelector, activityToSave: activityToSave, allActivities: activities, categoryNames: categoryNames)
                .environmentObject(activityToSave)
                .frame(width: screen.width, height: screen.height)
                .offset(x: showActivitySelector ? 0 : screen.width)
                .offset(y: screen.minY)
                .offset(x: viewState.width)
                .animation(.easeInOut)
                

And inside ActivitySelectorView I have a title bar and the filtered list which includes a searchbar and list

var body: some View {

    ZStack {
        
        //backgroundColor
        Color("\(activityToSave.category)Color")
    
        VStack {
            TitleBar(showingAlert: $showingAlert, showActivitySelector: $showActivitySelector, categoryName: categoryNames[(Int(String(activityToSave.category.last!)) ?? 1) - 1])
            
            //MARK: - LIST
            FilteredList(filter: activityToSave.category, passedActivityBinding: $activityToSave.activityName, showActivitySelector: $showActivitySelector)
                .colorMultiply(Color("\(activityToSave.category)Color"))
 
        }   
    }
}

Here we have FilteredList:

var body: some View {
    List {
        
        SearchBar(text: $searchText)
            
        
        ForEach(fetchRequest.wrappedValue.filter({ searchText.isEmpty ? true : $0.name.contains(searchText) }), id: \.self) { activity in
            Text(activity.name.capitalized)
                .onTapGesture {
                    self.showActivitySelector = false
                    self.selectedActivity = activity.name.capitalized
                }
                
        }.onDelete(perform: deleteActivity)
        
    }
    .resignKeyboardOnDragGesture()
}

And last the code for the searchBar

struct SearchBar: UIViewRepresentable {

@Binding var text: String

class Coordinator: NSObject, UISearchBarDelegate {
    
    @Binding var text: String
    
    init(text: Binding<String>) {
        _text = text
    }
    
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        text = searchText
    
    }
    
    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        UIApplication.shared.endEditing()
    }
    
    
    
    
}

func makeCoordinator() -> Coordinator {

    return Coordinator(text: $text)
}

func makeUIView(context: Context) -> UISearchBar {
    let searchBar = UISearchBar(frame: .zero)
    searchBar.delegate = context.coordinator
    searchBar.returnKeyType = .done
    searchBar.enablesReturnKeyAutomatically = false
    
    return searchBar
}


func updateUIView(_ uiView: UISearchBar, context: Context) {
    uiView.text = text
    
}

}

0 Answers
Related