[英]MKMapView and best way to zoom in on user's location
嘿,我有一個地圖視圖,可在加載視圖時放大用戶位置。 當前,我使用CLLocationManager
查找用戶位置,並在didUpdateLocations委托方法中初始化地圖。 但是,由於多次調用,因此我使用了一個全局BOOL
,該全局BOOL
在設置一次映射后設置為true,然后再也不進行設置。 這是代碼:
定義全局BOOL
並將其在viewDidLoad中設置為false
:
@implementation MainMapViewController
{
BOOL hasInitializedMap;
}
- (void)viewDidLoad
{
[super viewDidLoad];
hasInitializedMap = NO;
}
然后,我獲取用戶的位置並在(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
委托方法內設置地圖縮放:
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
CLLocation *location = [locations lastObject];
[self initializeMainMapView:location.coordinate.longitude latitude:location.coordinate.latitude];
}
- (void)initializeMainMapView:(float)longitude latitude:(float)latitude
{
if (!hasInitializedMap)
{
CLLocationCoordinate2D zoomLocation;
zoomLocation.latitude = latitude;
zoomLocation.longitude = longitude;
MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(zoomLocation, 1500, 1500);
[mainMapView setRegion:viewRegion animated:YES];
hasInitializedMap = YES;
}
}
這段代碼有效,但是讓我想知道是否有更好的方法可以做到這一點。 我討厭使用這樣的全局標志,因為它會使您的代碼混亂並且充斥。 有沒有更好的方法來做我想做的事情? 是否存在僅在用戶位置首次更新時才調用的委托方法? 我可以只使用MKMapView來做到這一點,而完全忘記CoreLocation
嗎?
我已經用幾種方法完成了...實際上,該框架已進行了幾次更改,所以我不記得自己是如何解決的。 MKMapkit確實有一種顯示用戶位置的方法, 開發人員doc :
此屬性不會指示用戶的位置在地圖上是否實際可見,而僅指示地圖視圖是否應嘗試顯示它。 將此屬性設置為YES會使地圖視圖使用“核心位置”框架來查找當前位置,並嘗試將其顯示在地圖上。 只要此屬性為YES,地圖視圖就會繼續跟蹤用戶的位置並定期對其進行更新。 此屬性的默認值為NO。
顯示用戶的位置並不能保證該位置在地圖上可見。 用戶可能已將地圖滾動到其他點,從而導致當前位置不在屏幕上。 要確定用戶的當前位置當前是否顯示在地圖上,請使用userLocationVisible屬性。
用戶的位置將顯示為注釋。 您可以獲取注釋並進行放大。 更好的方法是將該標志與具有方法-mapView:DidUpdateUserslocation的MKMapViewDelegate結合使用:
也許在您獲得第一個地圖后,您可以將地圖的跟蹤模式更改為無(我不確定是否會刪除用戶位置注釋,如果確實如此,您可以輕松地將地圖圖釘放在適當的皮膚上)。 -setUserTrakingMode:animated:是MKMap上可用於該方法的方法。
我要提醒的一件事是,在過去編寫與用戶位置配合使用的應用程序時,要花幾秒鍾才能獲得准確的位置。 在鎖定某個位置之前,您可能需要先讓GPS ping幾次。 我發現前幾個刻度可能非常不准確。 希望能有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.