2015-08-25 25 views
7

我已經建立了一個Android應用程序,它能夠使用谷歌地圖,用於顯示用戶提供WIFI,電池和GPS旁邊幾個附加信息的地理位置,例如QR碼,信標或任何我所能用來表示當前位置(我沒有考慮到這些位置的實際精度)。我正在使用LocationSource,並通過setLocationSource將它傳遞給Google Maps API。谷歌地圖:在iOS的定製LocationSource

我必須使用谷歌地圖作爲蘋果地圖是可用的變焦水平有限,所以我不能放大到建築。

是否可以提供自定義的LocationManager,通過某些操作定期更新並將其注入到Google Maps API中,如LocationSource

我知道有一些黑客會在地圖上放置自定義標記,但這會導致無法使用Google地圖的其他功能,例如通過點擊「我的位置」按鈕將相機移動到用戶位置。

謝謝。

+0

'CLLocationManager'與'LocationSource'不同,它會在用戶位置或標題更改時更新數據。 – ztan

回答

2

有一個解決方案。 Google Maps API使用Cocoa框架類CLLocationManager。每個人如何獲得有關當前GPS位置更改的信息都必須符合CLLocationManagerDelegate併成爲CLLocationManager對象的代表。通過 locationManager:didUpdateLocations:delegate方法將更新發送到委託對象。 這是每個人都知道的理論。所以爲了模擬位置數據,我們需要找到一種方法來調用這個方法,將我們自己的數據傳遞給它。 幸運的是動態改變任何類的行爲的機會,通過功能class_addMethodclass_replaceMethod。所以,現在我們可以改變的方法override_abc的方法ABC可以在一個類中實現像這樣實施:

let originalSelector = NSSelectorFromString("setDelegate:") 
let newSelector = NSSelectorFromString("override_setDelegate:") 

let originalMethod = class_getInstanceMethod(CLLocationManager.self, originalSelector) 
let newMethod = class_getInstanceMethod(CLLocationManager.self, newSelector) 

method_exchangeImplementations(originalMethod, newMethod) 

對於我們而言,我們需要改變二傳手的位置,管理者代表,加入我們自己的二傳手作爲擴展:

extension CLLocationManager { 
    func override_setDelegate(delegate: CLLocationManagerDelegate) { 
     // save a reference to self 
     GMLocationManager = self 
     override_setDelegate(delegate) 
    } 
} 

一旦我們已經保存在谷歌地圖位置管理器,我們現在可以調用的LocationManager的引用:使用一個額外的擴展方法simulateLocation委託方法:didUpdateLocations。

extension CLLocationManager { 
    func simulateLocation(location: CLLocation) { 
     self.delegate?.locationManager?(self, didUpdateLocations: [location]) 
    } 
} 
// ... 

GMLocationManager?.simulateLocation(fakeLocation) 
1

最簡單的辦法是,你描述。您禁用地圖的「我的位置」標記和「我的位置」按鈕,創建自定義位置標記,在地圖上添加自定義「我的位置」按鈕,該按鈕將轉到您的自定義標記。
禁用默認的「我的位置」的元素:

mMap.setMyLocationEnabled(false); 
mMap.getUiSettings().setMyLocationButtonEnabled(false); 
0

在我看來,對於現在是不是可以從任意位置源谷歌地圖在iOS注入自定義位置。不幸的是,我們只能使用pengrad所述的自定義位置標記。但是,這意味着一些額外的缺點,如不工作myLocation按鈕或使用當前位置進行導航。所以,這不是我們尋找的綜合解決方案。

在iOS上它仍然是最好的,使用Core Location框架,借鑑與它的當前位置自定義位圖視圖和移動走出大樓時,切換回平常谷歌地圖。