2017-01-24 1 views
0

Я новичок в Swift Programming. Я пытаюсь поместить карту Google в UITableView. Я могу это сделать?Как разместить Карты Google в TableView - Swift 3

Интерфейс пользователя должен быть таким:

enter image description here

Вот мой код для реализации UITableView с помощью раскадровки:

override func numberOfSections(in tableView: UITableView) -> Int { 

     return 3 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

     var rowCount = 0 

     if section == 0 { 
      rowCount = 1 
     } 

     if section == 1 { 
      rowCount = arrayOfStatic.count 
     } 
     if section == 2 { 
      rowCount = arrayOfDynamic.count 
     } 

     return rowCount 
    } 

    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 

     if indexPath.section == 0 { 
      return 250 
     } else { 
      return 70 
     } 
    } 

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    if indexPath.section == 0 { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "mapsCellId", for: indexPath) as! GoogleMapsCell 
     return cell 
    } else if indexPath.section == 1 { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "staticCellId", for: indexPath) as! StaticCell 
     return cell 
    } else { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "placesCellId", for: indexPath) as! PlacesCell 
     let ip = indexPath 

     cell.imageFoursquarePlaces.image = arrayOfDynamic[indexPath.row].image 
     cell.labelPlacesName.text = arrayOfDynamic[ip.row].name 
     cell.labelPlacesCategory.text = arrayOfDynamic[ip.row].category 
     return cell 
    } 
} 

Вот мой код для реализации UITableViewCell в первом разделе UITableView:

class GoogleMapsCell: UITableViewCell, GMSMapViewDelegate, CLLocationManagerDelegate { 
    @IBOutlet weak var googleMapsView: UIView! 
    @IBOutlet weak var buttonCurrentLoc: UIButton! 

    var googleMaps: GMSMapView! 
    var locationManager = CLLocationManager() 
    var camera = GMSCameraPosition() 

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
     self.showCurrentLocationOnMap() 
     self.locationManager.stopUpdatingLocation() 
    } 

    func showCurrentLocationOnMap() { 

     self.locationManager.delegate = self 
     self.locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters 
     self.locationManager.requestWhenInUseAuthorization() 
     self.locationManager.startUpdatingLocation() 

     let camera = GMSCameraPosition.camera(withLatitude: (self.locationManager.location?.coordinate.latitude)!, longitude: (self.locationManager.location?.coordinate.longitude)!, zoom: 15) 
     self.googleMaps = GMSMapView.map(withFrame: CGRect(x: 0,y: 0, width: self.googleMapsView.frame.size.width, height: self.googleMapsView.frame.height), camera: camera) 

     do { 
      if let styleURL = Bundle.main.url(forResource: "style", withExtension: "json") { 
       self.googleMaps.mapStyle = try GMSMapStyle(contentsOfFileURL: styleURL) 
      } else { 
       NSLog("Unable to find style.json") 
      } 
     } catch { 
      NSLog("The style definition could not be loaded: \(error)") 
     } 
     self.googleMaps.isMyLocationEnabled = true 
     self.googleMaps.accessibilityElementsHidden = false 

     self.addSubview(self.googleMaps) 
     self.googleMaps.camera = camera 
     self.addSubview(self.buttonCurrentLoc) 
    } 

} 

Это дает мне результат:

enter image description here

У меня есть searchBar в HeaderView. Я попытался установить Google Map View, создав UIView внутри первой ячейки TableView. Но я не могу показать Google Map View, и кнопка не может быть нажата. Как я могу это сделать?

Любой помощь будет оценен :)

+0

Вы настраиваете желаемых делегатов в ячейке? –

+0

@SyedAliSalman, я внедрил 'GMSMapViewDelegate' и' CLLocationManagerDelegate' для класса 'GoogleMapsCell'. – user1994

ответ

0

Вы забыли вызвать showCurrentLocationOnMap метод с своим экземпляром GoogleMapsCell «ы в cellForRowAtIndexPath.

let cell = tableView.dequeueReusableCell(withIdentifier: "mapsCellId", for: indexPath) as! GoogleMapsCell 

//add this method call 
cell.showCurrentLocationOnMap() 

return cell 

Или вы можете переопределить awakeFromNib в вашем GoogleMapsCell и вызвать метод showCurrentLocationOnMap с ним.

override func awakeFromNib() { 
    super.awakeFromNib() 
    self.showCurrentLocationOnMap() 
} 
+0

о, да! Я забыл написать эту часть. Благодаря! – user1994

+0

@ user1994 Приветственный помощник :) –