2013-03-02 30 views
5

Bir sorunum var. Mevcut konumum harita görünümünde görüntülenir ve ortalanır, ancak harita bölgesi yakınlaştırılmaz. Rob'un tavsiyesini didUpdateToLocation yönteminden alan ve bölge alarak almayı denedim ama doğru şekilde uygulamamalıydım. ViewDidLoad'da setRegion çağrımımı tanıdığını ve düğmelerimin tanınmayacağını düşünüyorum. Lütfen aşağıdaki kodumu kontrol edin ve hataları (hataları) belirtin. Amacım, IBAction düğmelerini kullanarak konumumu yakınlaştırıp uzaklaştırmak.Yakınlaştırmak için IBAction Düğmelerini Kullanma MapView

benim didUpdateToLocation yönteminde viewDidLoad

double miles = 0.5; 

MKCoordinateSpan span; 
span.latitudeDelta = miles/69.0; 
span.longitudeDelta = miles/69.0; 

MKCoordinateRegion region; 
region.span = span; 

[self.mapView setRegion:region animated:YES]; 

[self.mapView setUserTrackingMode:MKUserTrackingModeFollow animated:YES]; 

_mapView.mapType = MKMapTypeSatellite; 

.m içinde .m

- (IBAction)zoomIn:(id)sender; 

- (IBAction)zoomOut:(id)sender; 

.h.

[self.mapView setCenterCoordinate:newLocation.coordinate animated:YES]; 

.Zoom In:

- (IBAction)zoomIn:(id)sender 
{ 
    MKCoordinateSpan span; 
    span.latitudeDelta = _mapView.region.span.latitudeDelta * 2; 
    span.longitudeDelta = _mapView.region.span.latitudeDelta * 2; 
    MKCoordinateRegion region; 
    region.span = span; 
    region.center = _mapView.region.center; 

    [self.mapView setRegion:region animated:YES]; 
} 

.Zoom Out:

- (IBAction)zoomOut:(id)sender 
{ 
    MKCoordinateSpan span; 
    span.latitudeDelta = _mapView.region.span.latitudeDelta/2; 
    span.longitudeDelta = _mapView.region.span.latitudeDelta/2; 
    MKCoordinateRegion region; 
    region.span = span; 
    region.center = _mapView.region.center; 

    [self.mapView setRegion:region animated:YES]; 
} 

cevap

9

Geçerli, region olsun çarpın veya (yakınlaştırma bölünmesi Harita üzerindeki üzerine çarparak) ve ardından region ayarlamak uygun şekilde span ikiye bölebilirsiniz:

- (IBAction)zoomIn:(id)sender { 
    MKCoordinateRegion region = self.mapView.region; 
    region.span.latitudeDelta /= 2.0; 
    region.span.longitudeDelta /= 2.0; 
    [self.mapView setRegion:region animated:YES]; 
} 

- (IBAction)zoomOut:(id)sender { 
    MKCoordinateRegion region = self.mapView.region; 
    region.span.latitudeDelta = MIN(region.span.latitudeDelta * 2.0, 180.0); 
    region.span.longitudeDelta = MIN(region.span.longitudeDelta * 2.0, 180.0); 
    [self.mapView setRegion:region animated:YES]; 
} 

otomatik konuma Büyütmek harita var isterseniz

, şunları kullanabilirsiniz:

self.mapView.userTrackingMode = MKUserTrackingModeFollow; 

Bunu elle yapmak isterseniz, aşağıdaki gibi bir şey yapabilirsiniz. Öncelikle, zaten ya da değil yakınlaştırma ettik olup olmadığına ilişkin bir sınıf özelliğini tanımlamak:

@property (nonatomic) BOOL alreadySetZoomScale; 

sonra değiştirmek senin didUpdateLocations (veya didUpdateToLocation) Bunu kontrol ve bir kez yakınlaştırma ölçeğini ayarlamak için:

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 
{ 
    CLLocation* newLocation = [locations lastObject]; // if less than zero, then valid lat and long not found 

    if (newLocation.horizontalAccuracy < 0) 
     return; 

    if (!self.alreadySetZoomScale) 
    { 
     MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(newLocation.coordinate, 1609, 1609); // 1 mile = 1609.34 meters 
     self.mapView.region = region; 
     [self.mapView setRegion:region animated:YES]; 
     self.alreadySetZoomScale = YES; 
    } 
    else 
    { 
     [self.mapView setCenterCoordinate:newLocation.coordinate animated:YES]; 
    } 
} 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    // if prior to iOS 6, use this old `MKMapViewDelegate` method, but call our 
    // other routine. 

    if (SYSTEM_VERSION_LESS_THAN(@"6.0")) 
     [self locationManager:manager didUpdateLocations:@[newLocation]]; 
} 

Bu temel olarak, "henüz yakınlaştırmamışsam, bölgeyi newLocation ve bu konumun etrafına belirli bir metre cinsinden ayarla, ancak bunu daha önce yapmış olsaydım, geçerli konumuma göre merkezi koordinatı ayarla, ancak zum ölçeğini değiştirmeyin (zaten yakınlaştırılmış veya uzaktayım). S sürüm numarası mantığı (macros shown here'u kullanarak), son kullanıcının 6.0'dan önce iOS'u çalıştırdığından emin olmak için güncellenmiş yöntemimizi çağırır. Haritanın (örn self.mapView.showsUserLocation = YES;) kullanıcı yerini gösteren eğer arada

, sen aksi takdirde bırakabilir, ayrıca harita merkezini geçmeden önce MKUserLocation ilişkili bindirme kaldırmak bu didUpdateLocations olmasını isteyebilirsiniz etrafında oturan yaşlı bindirme:

[self.mapView removeOverlays:self.mapView.overlays]; 
+0

Aynı burada. Lütfen yorumumu Manu'ya oku. Cevap için teşekkürler. – JBeesky

+0

@ user1886166 "span" öğesini "didUpdateToLocation" olarak ayarlıyorsunuz. Yapma. Bunu bir kez yapın (örn., Yeri ilk kez aldığınızda) ve bu noktadan sonra 'MKMapView' yöntemini kullanın; setCenterCoordinate', ancak bu noktadan sonra bununla uğraşmayın. Açıkçası, harita görünümünüzün kullanıcıyı hareket ettikçe takip etmesini istiyorsanız, muhtemelen bunu manuel olarak yapmamalısınız. 'MKMapView' 'userTrackingMode' özelliğini ayarlamayı düşünmelisiniz. – Rob

+0

Denedim ama hala doğru değil. Lütfen bana neyi yanlış yaptığımı söyle ve kontrol et. Üzgünüm, MKMapView'a pek aşina değilim ama ne dediğini anlıyorum. – JBeesky

1

bu deneyin. Ama henüz test olmadım.

- (IBAction)zoomIn:(id)sender { 
     MKCoordinateSpan span; 
     span.latitudeDelta = _mapView.region.span.latitudeDelta * 2; 
     span.longitudeDelta = _mapView.region.span.latitudeDelta * 2; 
     MKCoordinateRegion region; 
     region.span = span; 
     region.center = _mapView.region.center; 

    [self.mapView setRegion:region animated:YES]; 
} 

- (IBAction)zoomOut:(id)sender { 
     MKCoordinateSpan span; 
     span.latitudeDelta = _mapView.region.span.latitudeDelta/2; 
     span.longitudeDelta = _mapView.region.span.latitudeDelta/2; 
     MKCoordinateRegion region; 
     region.span = span; 
     region.center = _mapView.region.center; 

    [self.mapView setRegion:region animated:YES]; 

} 
+0

Yanıt için teşekkürler. Yakınlaştırma çalışır ancak yakınlaştırılmış bölge kalmaz. Hızlı bir şekilde, didUpdateToLocation'da adı verilen orijinal yakınlaştırmaya geri döner. Ben didUpdateToLocation sürekli olarak güncellenir ve çalışırken orijinal aralığını geri çağırır düşünüyorum. Bu sorunu düzeltmek için herhangi bir fikriniz var mı? Yakınlaştırılmış görünümün geri dönmeden geri kalmasını mı istiyorsunuz? – JBeesky

1

Tamam, bu benim 2 IBAction düğmeleri (Zoomin ve ZoomOut) benim MapView ile işe gitmek için kullanarak sona budur.Uygulamayı açtığınızda, kullanıcı konumu görüntülenir ve harita yakınlaştırır ve etrafındaki merkezler. Daha sonra düğmeleri 2'ye kadar büyütmek veya uzaklaştırmak için kullanabilirsiniz. * Bana yolu gösteren Rob'a çok teşekkür ederim.

.m

@interface LocationViewController() 

@property (nonatomic) BOOL alreadySetZoomScale; 

@end 



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


if (!_alreadySetZoomScale) 
{ 
MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(newLocation.coordinate, 1609, 1609); // 1 mile = 1609.34 meters 

self.mapView.region = region; 
[self.mapView setRegion:region animated:YES]; 
_alreadySetZoomScale = YES; 

} 

else 

{ 
[self.mapView setCenterCoordinate:newLocation.coordinate animated:YES]; 
} 


- (IBAction)zoomIn:(id)sender { 

MKCoordinateRegion region = self.mapView.region; 
region.span.latitudeDelta /= 2.0; 
region.span.longitudeDelta /= 2.0; 
self.mapView.region = region; 

} 

- (IBAction)zoomOut:(id)sender {; 

MKCoordinateRegion region = self.mapView.region; 
region.span.latitudeDelta *= 2.0; 
region.span.longitudeDelta *= 2.0; 
self.mapView.region = region; 

} 

- (IBAction)zoomIn:(id)sender; 

- (IBAction)zoomOut:(id)sender; 
Ben self.mapView.showsUserLocation gibi MKMapView yapılan diğer aramalar sahip .h

= EVET; viewDidLoad içinde ama bu oldukça fazla.

0

Swift 2.0:

Uzantısı kullanma:

extension MKMapView{ 

func zoomInPinAnnotationLocation(targetMapViewName : MKMapView?, delta: Double) 
{ 
    var region: MKCoordinateRegion = targetMapViewName!.region 
    region.span.latitudeDelta /= delta 
    region.span.longitudeDelta /= delta 
    targetMapViewName!.region = region 

} 
func zoomOutPinAnnotationLocation(targetMapViewName : MKMapView?,delta: Double) 
{ 
    var region: MKCoordinateRegion = targetMapViewName!.region 
    region.span.latitudeDelta *= delta 
    region.span.longitudeDelta *= delta 
    targetMapViewName!.region = region 
} 

} 

Kullanımı:

var mapViewZoomStepperValue: Double = -1.0 
@IBOutlet weak var mapViewZoomStepper: UIStepper! 

@IBAction func mapViewZoomStepperValueChanged(sender: AnyObject) { 

    if (mapViewZoomStepper.value > mapViewZoomStepperValue) 
    { 
    mapViewZoomStepperValue = mapViewZoomStepperValue + 1.0 

//Zoom In 
    detailMapView.zoomInPinAnnotationLocation(detailMapView, delta: 3.0) 
    } 
    else 
    { 
    mapViewZoomStepperValue = mapViewZoomStepper.value - 1.0 

//Zoom Out 
    detailMapView.zoomOutPinAnnotationLocation(detailMapView, delta: 3.0) 
    } 

} 
-1

Sen kod 3 hatlarında en temel elde edebiliriz

var region: MKCoordinateRegion = self.mapView.region 
region = MKCoordinateRegionMake(self.mapView.centerCoordinate, MKCoordinateSpanMake(0.005, 0.005)); 
self.mapView.setRegion(region, animated: true) 
0

Swift 3:

import GoogleMaps 
import GooglePlaces 
import CoreLocation 
import UIKit 

class LocationMapView: UIViewController, GMSMapViewDelegate, CLLocationManagerDelegate { 

    @IBOutlet weak var mapView: GMSMapView! 

    var mapViewZoomStepperValue: Float = 0.0 
    @IBOutlet weak var mapViewZoomStepper: UIStepper! 

    override func viewDidLoad() { 
      super.viewDidLoad() 

      mapViewZoomStepper.minimumValue = -100 

     } 

     @IBAction func mapViewZoomStepperValueChanged(_ sender: Any) { 

      if (Float(mapViewZoomStepper.value) > mapViewZoomStepperValue){ 

       mapViewZoomStepperValue = Float(mapViewZoomStepper.value) 
       zoomIn() 

      }else{ 

       mapViewZoomStepperValue = Float(mapViewZoomStepper.value) 
       zoomOut() 

      } 

     } 

     func zoomIn() { 

      print("Zoom in!!") 
      if mapView.camera.zoom == mapView.maxZoom { 
       return 
      } 

      let currentZoom = mapView.camera.zoom + 1 
      mapViewZoomController(currentZoom) 

     } 

     func zoomOut() { 

      print("Zoom out!!") 
      if mapView.camera.zoom == mapView.minZoom { 
       return 
      } 

      let currentZoom = mapView.camera.zoom - 1 
      mapViewZoomController(currentZoom) 

     } 

     func mapViewZoomController(_ level: Float) { 

      let point: CGPoint = mapView.center 
      let coor: CLLocationCoordinate2D = mapView.projection.coordinate(for: point) 
      let camera = GMSCameraPosition.camera(withLatitude: coor.latitude, longitude: coor.longitude, zoom: Float(level)) 
      mapView.animate(to: camera) 

     } 

} 
İlgili konular