AutocompleteWithSearchViewController.swift 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. // Copyright 2020 Google LLC. All rights reserved.
  2. //
  3. //
  4. // Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
  5. // file except in compliance with the License. You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software distributed under
  10. // the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
  11. // ANY KIND, either express or implied. See the License for the specific language governing
  12. // permissions and limitations under the License.
  13. import GooglePlaces
  14. import UIKit
  15. /// Demo showing the use of GMSAutocompleteViewController with a UISearchController. Please refer to
  16. /// https://developers.google.com/places/ios-sdk/autocomplete
  17. class AutocompleteWithSearchViewController: AutocompleteBaseViewController {
  18. let searchBarAccessibilityIdentifier = "searchBarAccessibilityIdentifier"
  19. private lazy var autoCompleteController: GMSAutocompleteResultsViewController = {
  20. let controller = GMSAutocompleteResultsViewController()
  21. if let config = autocompleteConfiguration {
  22. controller.autocompleteFilter = config.autocompleteFilter
  23. controller.placeFields = config.placeFields
  24. }
  25. controller.delegate = self
  26. return controller
  27. }()
  28. private lazy var searchController: UISearchController = {
  29. let controller =
  30. UISearchController(searchResultsController: autoCompleteController)
  31. controller.hidesNavigationBarDuringPresentation = false
  32. controller.searchBar.autoresizingMask = .flexibleWidth
  33. controller.searchBar.searchBarStyle = .minimal
  34. controller.searchBar.delegate = self
  35. controller.searchBar.accessibilityIdentifier = searchBarAccessibilityIdentifier
  36. controller.searchBar.sizeToFit()
  37. return controller
  38. }()
  39. override func viewDidLoad() {
  40. super.viewDidLoad()
  41. autoCompleteController.delegate = self
  42. navigationItem.titleView = searchController.searchBar
  43. definesPresentationContext = true
  44. searchController.searchResultsUpdater = autoCompleteController
  45. searchController.modalPresentationStyle =
  46. UIDevice.current.userInterfaceIdiom == .pad ? .popover : .fullScreen
  47. // Prevents the tableview goes under the navigation bar.
  48. automaticallyAdjustsScrollViewInsets = true
  49. }
  50. }
  51. extension AutocompleteWithSearchViewController: GMSAutocompleteResultsViewControllerDelegate {
  52. func resultsController(
  53. _ resultsController: GMSAutocompleteResultsViewController,
  54. didAutocompleteWith place: GMSPlace
  55. ) {
  56. searchController.isActive = false
  57. super.autocompleteDidSelectPlace(place)
  58. }
  59. func resultsController(
  60. _ resultsController: GMSAutocompleteResultsViewController,
  61. didFailAutocompleteWithError error: Error
  62. ) {
  63. searchController.isActive = false
  64. super.autocompleteDidFail(error)
  65. }
  66. }
  67. extension AutocompleteWithSearchViewController: UISearchBarDelegate {
  68. func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
  69. // Inform user that the autocomplete query has been cancelled and dismiss the search bar.
  70. searchController.isActive = false
  71. searchController.searchBar.isHidden = true
  72. super.autocompleteDidCancel()
  73. }
  74. }