我正在使用Google地图教程(http://www.raywenderlich.com/81103/introduction-google-maps-ios-sdk-swift)并通过将其嵌入到标签控制器中来增强它。一旦我将它作为第二个标签,它就不再有用了。
如果我将其移动到主要标签(默认标签),它可以正常工作,但它不会显示拉位置甚至显示所有控件。我已将逻辑从viewDidLoad()移到viewWillAppear(),但这也没有帮助。
关于可能导致此问题的任何想法?
这是MapViewController.swift
中的代码//
// MapViewController.swift
// Feed Me
//
// Created by Ron Kliffer on 8/30/14.
// Copyright (c) 2014 Ron Kliffer. All rights reserved.
//
import UIKit
class MapViewController: UIViewController, TypesTableViewControllerDelegate, CLLocationManagerDelegate, GMSMapViewDelegate {
@IBOutlet weak var addressLabel: UILabel!
@IBOutlet weak var mapView: GMSMapView!
@IBOutlet weak var mapCenterPinImage: UIImageView!
@IBOutlet weak var pinImageVerticalConstraint: NSLayoutConstraint!
var searchedTypes = ["bakery", "bar", "cafe", "grocery_or_supermarket", "restaurant"]
let locationManager = CLLocationManager()
let dataProvider = GoogleDataProvider()
var randomLineColor: UIColor {
get {
let randomRed = CGFloat(drand48())
let randomGreen = CGFloat(drand48())
let randomBlue = CGFloat(drand48())
return UIColor(red: randomRed, green: randomGreen, blue: randomBlue, alpha: 1.0)
}
}
var mapRadius: Double {
get {
let region = mapView.projection.visibleRegion()
let verticalDistance = GMSGeometryDistance(region.farLeft, region.nearLeft)
let horizontalDistance = GMSGeometryDistance(region.farLeft, region.farRight)
return max(horizontalDistance, verticalDistance)*0.5
}
}
func fetchNearbyPlaces(coordinate: CLLocationCoordinate2D) {
// 1
mapView.clear()
// 2
dataProvider.fetchPlacesNearCoordinate(coordinate, radius:mapRadius, types: searchedTypes) { places in
for place: GooglePlace in places {
// 3
let marker = PlaceMarker(place: place)
// 4
marker.map = self.mapView
}
}
}
@IBAction func refreshPlaces(sender: AnyObject) {
fetchNearbyPlaces(mapView.camera.target)
}
@IBAction func mapTypeSegmentPressed(sender: AnyObject) {
let segmentedControl = sender as UISegmentedControl
switch segmentedControl.selectedSegmentIndex {
case 0:
mapView.mapType = kGMSTypeNormal
case 1:
mapView.mapType = kGMSTypeSatellite
case 2:
mapView.mapType = kGMSTypeHybrid
default:
mapView.mapType = mapView.mapType
}
}
func mapView(mapView: GMSMapView!, markerInfoContents marker: GMSMarker!) -> UIView! {
// 1
let placeMarker = marker as PlaceMarker
// 2
if let infoView = UIView.viewFromNibName("MarkerInfoView") as? MarkerInfoView {
// 3
infoView.nameLabel.text = placeMarker.place.name
// 4
if let photo = placeMarker.place.photo {
infoView.placePhoto.image = photo
} else {
infoView.placePhoto.image = UIImage(named: "generic")
}
return infoView
} else {
return nil
}
}
// 1
func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
// 2
if status == .AuthorizedWhenInUse {
// 3
locationManager.startUpdatingLocation()
//4
mapView.myLocationEnabled = true
mapView.settings.myLocationButton = true
}
}
func mapView(mapView: GMSMapView!, didTapMarker marker: GMSMarker!) -> Bool {
mapCenterPinImage.fadeOut(0.25)
return false
}
// 5
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
if let location = locations.first as? CLLocation {
// 6
mapView.camera = GMSCameraPosition(target: location.coordinate, zoom: 15, bearing: 0, viewingAngle: 0)
// 7
locationManager.stopUpdatingLocation()
fetchNearbyPlaces(location.coordinate)
}
}
func reverseGeocodeCoordinate(coordinate: CLLocationCoordinate2D) {
let geocoder = GMSGeocoder()
geocoder.reverseGeocodeCoordinate(coordinate) { response , error in
//Add this line
self.addressLabel.unlock()
if let address = response?.firstResult() {
let lines = address.lines as [String]
self.addressLabel.text = join("\n", lines)
let labelHeight = self.addressLabel.intrinsicContentSize().height
self.mapView.padding = UIEdgeInsets(top: self.topLayoutGuide.length, left: 0, bottom: labelHeight, right: 0)
UIView.animateWithDuration(0.25) {
self.pinImageVerticalConstraint.constant = ((labelHeight - self.topLayoutGuide.length) * 0.5)
self.view.layoutIfNeeded()
}
}
}
}
func mapView(mapView: GMSMapView!, didTapInfoWindowOfMarker marker: GMSMarker!) {
// 1
let googleMarker = mapView.selectedMarker as PlaceMarker
// 2
dataProvider.fetchDirectionsFrom(mapView.myLocation.coordinate, to: googleMarker.place.coordinate) {optionalRoute in
if let encodedRoute = optionalRoute {
// 3
let path = GMSPath(fromEncodedPath: encodedRoute)
let line = GMSPolyline(path: path)
// 4
line.strokeWidth = 4.0
line.tappable = true
line.map = self.mapView
line.strokeColor = self.randomLineColor
// 5
mapView.selectedMarker = nil
}
}
}
func mapView(mapView: GMSMapView!, willMove gesture: Bool) {
addressLabel.lock()
if (gesture) {
mapCenterPinImage.fadeIn(0.25)
mapView.selectedMarker = nil
}
}
func didTapMyLocationButtonForMapView(mapView: GMSMapView!) -> Bool {
mapCenterPinImage.fadeIn(0.25)
mapView.selectedMarker = nil
return false
}
func mapView(mapView: GMSMapView!, idleAtCameraPosition position: GMSCameraPosition!) {
reverseGeocodeCoordinate(position.target)
}
// override func viewDidLoad() {
// super.viewDidLoad()
// locationManager.delegate = self
// locationManager.requestWhenInUseAuthorization()
// mapView.delegate = self
// }
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
locationManager.delegate = self
locationManager.requestWhenInUseAuthorization()
mapView.delegate = self
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "Types Segue" {
let navigationController = segue.destinationViewController as UINavigationController
let controller = segue.destinationViewController.topViewController as TypesTableViewController
controller.selectedTypes = searchedTypes
controller.delegate = self
}
}
// MARK: - Types Controller Delegate
func typesController(controller: TypesTableViewController, didSelectTypes types: [String]) {
searchedTypes = sorted(controller.selectedTypes)
dismissViewControllerAnimated(true, completion: nil)
fetchNearbyPlaces(mapView.camera.target)
}
}
正如您所看到的,我已尝试将代码从viewDidLoad()移动到viewWillAppear(),但我认为问题在于委托。我想也许代表可能会从控制器中丢失到tabcontroller,因此它无法正确绘制它。
答案 0 :(得分:0)
我更接近于了解经过数小时调试后发生的事情。如果didChangeAuthorizationStatus为我的CLLocationManager实例触发,则仅显示指南针控件。出于某种原因,当它是第二个标签栏项时,它不会像第一个标签栏项那样经常触发。当它是第一个标签栏项时,每次打开应用程序时都会触发它。所以,我将我的代码从didChangeAuthorizationStatus内部移到了它自己的函数中。我从viewDidAppear()和didChangeAuthorizationStatus()调用它,以便指南针正常工作,我的位置也会出现。
感谢您对此问题的所有帮助。 CLLocationManager不一致地触发是一个不同的问题,所以我将回答这个并继续前进。再次感谢。