iosswiftxcodeuiviewsubviews

Subview is not using full view of container


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()

}
}

Solution

  • 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