So, I am using a UIView as a container for a subview that will hold Google Maps inside of it. After implementing it though there is still some of the containers that can be seen due to the fact that the subview is not using the full container like it should be. Did I do something wrong? Am I missing some code? This is what it currently looks like... https://i.sstatic.net/eT1TK.jpg
class SecondViewController: UIViewController,
CLLocationManagerDelegate, LocateOnTheMap,
GMSAutocompleteFetcherDelegate, UISearchBarDelegate {
func didAutocomplete(with predictions: [GMSAutocompletePrediction]) {
for prediction in predictions {
if let prediction = prediction as GMSAutocompletePrediction?{
self.resultsArray.append(prediction.attributedFullText.string)
}
}
self.searchResultController.reloadDataWithArray(self.resultsArray)
print(resultsArray)
}
func didFailAutocompleteWithError(_ error: Error) {
}
@IBOutlet weak var MapViewContainer: UIView!
var googleMapsView: GMSMapView!
var searchResultController: SearchResultsController!
var resultsArray = [String]()
var gmsFetcher: GMSAutocompleteFetcher!
@IBAction func searchWithAddress(_ sender: AnyObject) {
let searchController = UISearchController(searchResultsController: searchResultController)
searchController.searchBar.delegate = self
self.present(searchController, animated:true, completion: nil)
}
let locationDelegate = LocationDelegate()
var latestLocation: CLLocation? = nil
var yourLocationBearing: CGFloat { return
latestLocation?.bearingToLocationRadian(self.yourLocation) ?? 0 }
var yourLocation: CLLocation {
get { return UserDefaults.standard.currentLocation }
set { UserDefaults.standard.currentLocation = newValue }
}
//Location Manager Variable
let manager = CLLocationManager()
//viewDidLoad
override func viewDidLoad() {
super.viewDidLoad()
//Map Options
self.googleMapsView = GMSMapView(frame: self.MapViewContainer.bounds)
self.googleMapsView.clipsToBounds = true
self.MapViewContainer.addSubview(self.googleMapsView)
searchResultController = SearchResultsController()
searchResultController.delegate = self
gmsFetcher = GMSAutocompleteFetcher()
gmsFetcher.delegate = self
googleMapsView.isMyLocationEnabled = true
googleMapsView.mapType = .normal
googleMapsView.settings.compassButton = true
googleMapsView.settings.myLocationButton = true
googleMapsView.settings.zoomGestures = true
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let location = locations.last
let camera = GMSCameraPosition.camera(withLatitude: (location?.coordinate.latitude)!, longitude:(location?.coordinate.longitude)!, zoom:14)
googleMapsView.animate(to: camera)
//Finally stop updating location otherwise it will come again and again in this delegate
self.locationManager.stopUpdatingLocation()
}
func locateWithLongitude(_ lon: Double, andLatitude lat: Double, andTitle title: String) {
DispatchQueue.main.async { () -> Void in
let position = CLLocationCoordinate2DMake(lat, lon)
let marker = GMSMarker(position: position)
let camera = GMSCameraPosition.camera(withLatitude: lat, longitude: lon, zoom: 10)
self.googleMapsView.camera = camera
marker.title = "Address : \(title)"
marker.map = self.googleMapsView
}
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
self.resultsArray.removeAll()
gmsFetcher?.sourceTextHasChanged(searchText)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
You need to override the viewDidLayoutSubviews
of your ViewController, as I said in my comment and
func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.googleMapsView.frame = self.MapViewContainer.bounds
}
You also need to remove this line self.googleMapsView.clipsToBounds = true
in viewDidLoad