子视图未使用容器的完整视图
Subview is not using full view of container
因此,我使用 UIView 作为子视图的容器,其中将包含 Google 地图。在实现它之后,由于子视图没有像它应该的那样使用完整的容器,所以仍然可以看到一些容器。我做错什么了吗?我错过了一些代码吗?
这是它目前的样子... https://imgur.com/a/k0pj0
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()
}
}
您需要覆盖 ViewController 的 viewDidLayoutSubviews
,正如我在评论中所说,
func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.googleMapsView.frame = self.MapViewContainer.bounds
}
您还需要在 viewDidLoad
中删除此行 self.googleMapsView.clipsToBounds = true
因此,我使用 UIView 作为子视图的容器,其中将包含 Google 地图。在实现它之后,由于子视图没有像它应该的那样使用完整的容器,所以仍然可以看到一些容器。我做错什么了吗?我错过了一些代码吗? 这是它目前的样子... https://imgur.com/a/k0pj0
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()
}
}
您需要覆盖 ViewController 的 viewDidLayoutSubviews
,正如我在评论中所说,
func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.googleMapsView.frame = self.MapViewContainer.bounds
}
您还需要在 viewDidLoad
self.googleMapsView.clipsToBounds = true