2011-04-09 43 views
2

我製作了一個地圖,以自動放大顯示用戶位置,但是當用戶嘗試縮小時,它會自動縮放,這不切實際,您能幫我嗎禁用用戶縮小時的自動放大功能嗎?。這裏是我的代碼部分:當用戶縮小時自動縮放重置

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{ 
     // store new user location 
     location = newLocation.coordinate; 
     //move the map to the new user location 
     MKCoordinateRegion region; 
     region.center = location; 
     // zoom level 
     MKCoordinateSpan span; 
     span.latitudeDelta = .005; 
     span.longitudeDelta = .005; 
     region.span = span; 
     // apply new coordinates 
     [mapView setRegion:region animated:TRUE]; 

} 

編輯: 我在viewDidLoad中添加以下語句:

mapView.zoomEnabled=FALSE; 

應該禁用它在當用戶縮小自動變焦?

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // 
    // On veut afficher la position courante de l'utilisateur 
    [mapView setShowsUserLocation:TRUE]; 
    // MKMapTypeStandard est un mode d'affichage parmis 3 disponibles 
    // (les deux autres sont MKMapTypeSatelitte et MKMapTypeHybrid et MKMapTypeStandard) 
    [mapView setMapType:MKMapTypeHybrid]; 
    // Le fait de setter le Delegate permet d'appeler méthodes implémentées dans cette classe 
    [mapView setDelegate:self]; 
    // On ajoute la View du mapView a la View du controlleur courant afin de faire afficher la carte 
    [self.view insertSubview:mapView atIndex:0]; 

    // CLLocationManager permet la gestion de la position géographique de l'utilisateur 
    CLLocationManager *locationManager=[[CLLocationManager alloc] init]; 
    // Le fait de setter le Delegate permet d'appeler méthodes implémentées dans cette classe 
    [locationManager setDelegate:self]; 
    // Définit l'échelle de distance à prendre en compte pour le raffraichissement de la position courante 
    [locationManager setDesiredAccuracy:kCLLocationAccuracyNearestTenMeters]; 

    [locationManager startUpdatingLocation]; 
    mapView.zoomEnabled=FALSE; 


    } 

編輯: 我仍然工作在這一點,所以在繼續之前,我想告訴你我的邏輯,我等待你的建議:) 所以,在我看來這是充電爲了向我顯示地圖上的用戶位置,添加了一個布爾變量來測試用戶是否調整了縮放比例。 .H

BOOL shouldAdjustZoom; 

和方法:

-(void)zoomLevelForMapRect:(MKMapRect)mRect withMapViewSizeInPixels:(CGSize)viewSizeInPixels; 
-(void)setShouldAdjustZoom:(BOOL)shouldAdjZoom; 
-(BOOL)shouldAdjustZoom; 

.M

我添加了吸氣-(BOOL)shouldAdjustZoom的實施,使此getter將調用zoomLevelForMapRect知道縮放級別是否改變。

-(BOOL)shouldAdjustZoom 
{ 

    [self zoomLevelForMapRect]; 
    return shouldAdjustZoom; 

} 
-(void)zoomLevelForMapRect:(MKMapRect)mRect withMapViewSizeInPixels:(CGSize)viewSizeInPixels { 


    NSUInteger zoomLevel=20; 
    MKZoomScale zoomScale=mRect.size.width/viewSizeInPixels.width; 
    double zoomExponent=log2(zoomScale); 
    zoomLevel=(NSUInteger)(20-ceil(zoomExponent)); 
    if(zoomLevel<20) 
    { 

     [self setShouldAdjustZoom:NO]; 


    } 



} 


- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{ 

    location = newLocation.coordinate; 

    MKCoordinateRegion region; 
    region.center = location; 

    if ([self shouldAdjustZoom]==YES) { 
     // Use the manually defined span 
     MKCoordinateSpan span; 
     span.latitudeDelta = .005; 
     span.longitudeDelta = .005; 
     region.span = span; 
    } else { 
     // Keep the current span 
     MKCoordinateRegion mapRegion = mapView.region; // To get the current span 
     mapRegion.center = newLocation.coordinate; 
     mapView.region = mapRegion; 
    } 

    MKCoordinateSpan span; 

    span.latitudeDelta = .005; 
    span.longitudeDelta = .005; 
    region.span = span; 
    [mapView setRegion:region animated:TRUE]; 

} 

我需要知道的是,我應該怎麼稱呼的zoomLevelForMapRect方法,它與參數,在吸氣我需要調用它:

-(BOOL)shouldAdjustZoom 
     { 

      [self zoomLevelForMapRect];//how should I fix the call?? 
      return shouldAdjustZoom; 

     } 

回答

2

有沒有這樣的東西自動縮放。您可以通過定義跨度來手動設置縮放級別:

span.latitudeDelta = .005; 
span.longitudeDelta = .005; 

手動設置跨度將始終顯示固定縮放級別。

如果你想保持當前的縮放級別,這樣做:

MKCoordinateRegion mapRegion = mapView.region; // To get the current span 
mapRegion.center = newLocation.coordinate; 
mapView.region = mapRegion; 

考慮使用一個標誌您的期望的行爲之間交替。

I.e.

在viewDidLoad中設置_shouldAdjustZoom = YES;然後,當用戶調節縮放設置_shouldAdjustZoom = NO;(有地圖視圖的委託方法,當用戶改變變焦的稱呼)

(void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
      fromLocation:(CLLocation *)oldLocation 
{ 
    if (_shouldAdjustZoom) { 
     // Use the manually defined span 
    } else { 
     // Keep the current span 
    } 
} 
+0

嗨,THX很多關於你的解釋,問題,你的意思是「考慮使用一個標誌來交替你想要的行爲。」 ?thx – Malloc 2011-04-10 10:44:50

+0

經緯度和經度變量假設包含從哪裏? – Malloc 2011-04-10 12:18:54

+0

緯度和經度是用戶的位置,不適合更新我的答案。 – Robert 2011-04-10 18:24:43

相關問題