2011-06-28 33 views
6

Mam widok MAP w mojej aplikacji i chcę dodać pinezkę adnotacji (czerwona pinezka) na środku widoku mapy.
Teraz, gdy użytkownik przewinie widok mapy, powinien dopasować środek za pomocą tego.
Jak to zrobić?
DziękujęJak dodać adnotację do środka mapy w iPhonie?

+0

oznacza to, że są zmiany położenia sworznia zmieniając środek. –

+0

@Muhammad Zeeshan - tak, kiedy użytkownik przewinie mapę, czerwony pin (adnotacja) powinien się zmienić, aby dostosować się do nowego środka widoku mapy, który jest widoczny dla użytkownika. – dks1725

+0

spróbuj umieścić adnotację na środku mapy –

Odpowiedz

10

Jeśli chcesz użyć rzeczywistej adnotacji zamiast zwykłym widoku umieszczony powyżej środka widoku mapy można:

  • użyć klasy adnotacji z ustawianego współrzędnych obiektu (pre -definiowana klasa MKPointAnnotation np.). Pozwala to uniknąć konieczności usuwania i dodawania adnotacji, gdy centrum się zmienia.
  • tworzenia adnotacji w viewDidLoad
  • zachować odniesienie do niej w nieruchomości, powiedzmy centerAnnotation
  • zmiana jego współrzędnych (i tytuł, etc) w regionDidChangeAnimated metody delegata widoku mapy za (upewnij nieruchomość delegat widoku mapy jest ustawiony)

przykład:

@interface SomeViewController : UIViewController <MKMapViewDelegate> { 
    MKPointAnnotation *centerAnnotation; 
} 
@property (nonatomic, retain) MKPointAnnotation *centerAnnotation; 
@end 

@implementation SomeViewController 

@synthesize centerAnnotation; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    MKPointAnnotation *pa = [[MKPointAnnotation alloc] init]; 
    pa.coordinate = mapView.centerCoordinate; 
    pa.title = @"Map Center"; 
    pa.subtitle = [NSString stringWithFormat:@"%f, %f", pa.coordinate.latitude, pa.coordinate.longitude]; 
    [mapView addAnnotation:pa]; 
    self.centerAnnotation = pa; 
    [pa release]; 
} 

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated { 
    centerAnnotation.coordinate = mapView.centerCoordinate; 
    centerAnnotation.subtitle = [NSString stringWithFormat:@"%f, %f", centerAnnotation.coordinate.latitude, centerAnnotation.coordinate.longitude]; 
} 

- (void)dealloc { 
    [centerAnnotation release]; 
    [super dealloc]; 
} 

@end 

teraz Przesuwa adnotacji ale gładko. Jeśli potrzebujesz adnotacji poruszać się płynnie, można dodać UIPanGestureRecognizer i UIPinchGestureRecognizer do widoku mapy, a także aktualizować adnotacji w przewodnika gest:

// (Also add UIGestureRecognizerDelegate to the interface.) 

    // In viewDidLoad: 
    UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)]; 
    panGesture.delegate = self; 
    [mapView addGestureRecognizer:panGesture]; 
    [panGesture release]; 

    UIPinchGestureRecognizer *pinchGesture = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)]; 
    pinchGesture.delegate = self; 
    [mapView addGestureRecognizer:pinchGesture]; 
    [pinchGesture release]; 

- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer 
{ 
    centerAnnotation.coordinate = mapView.centerCoordinate; 
    centerAnnotation.subtitle = [NSString stringWithFormat:@"%f, %f", centerAnnotation.coordinate.latitude, centerAnnotation.coordinate.longitude]; 
} 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
    //let the map view's and our gesture recognizers work at the same time... 
    return YES; 
} 
+0

dziękuję za pracę perfect .. – dks1725

+0

+1 ode mnie, wciąż powyżej rozwiązania nie daje "wciąż" adnotacji, ale jest doskonałym fundamentem, jak również wspomnianym zobacz powyżej rozwiązania mapy. –

+0

Czy ktoś może napisać ten kod w szybkim tempie:)? –

4

odpowiedź Anny jest mądre podejście do utrzymywania adnotacji w środku mapuj przy użyciu adnotacji w standardowy sposób mapowania. Jednak, jak zauważył jeden z komentatorów, przewijanie i szczypanie, mimo że znacznie lepsze, nadal wykazuje zauważalne opóźnienie, a zalecanym podejściem byłoby dodanie widoku adnotacji jako podglądu widoku mapy. Oto, jak to wygląda.

@interface SHCenterPinMapViewController() <MKMapViewDelegate> 

@property (weak, nonatomic) IBOutlet MKMapView *mapView; 
@property (strong, nonatomic) MKPointAnnotation *centerAnnotaion; 
@property (strong, nonatomic) MKPinAnnotationView *centerAnnotationView; 

@end 

@implementation SHCenterPinMapViewController 

- (MKPointAnnotation *)centerAnnotaion 
{ 
    if (!_centerAnnotaion) { 
     _centerAnnotaion = [[MKPointAnnotation alloc] init]; 
    } 

    return _centerAnnotaion; 
} 

- (MKPinAnnotationView *)centerAnnotationView 
{ 
    if (!_centerAnnotationView) { 
     _centerAnnotationView = [[MKPinAnnotationView alloc] initWithAnnotation:self.centerAnnotaion 
                   reuseIdentifier:@"centerAnnotationView"]; 
    } 

    return _centerAnnotationView; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.mapView.delegate = self; 
    [self.mapView addSubview:self.centerAnnotationView]; 
} 

-(void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    [self moveMapAnnotationToCoordinate:self.mapView.centerCoordinate]; 
} 

// These are the constants need to offset distance between the lower left corner of 
// the annotaion view and the head of the pin 
#define PIN_WIDTH_OFFSET 7.75 
#define PIN_HEIGHT_OFFSET 5 

- (void)moveMapAnnotationToCoordinate:(CLLocationCoordinate2D) coordinate 
{ 
    CGPoint mapViewPoint = [self.mapView convertCoordinate:coordinate toPointToView:self.mapView]; 

    // Offset the view from to account for distance from the lower left corner to the pin head 
    CGFloat xoffset = CGRectGetMidX(self.centerAnnotationView.bounds) - PIN_WIDTH_OFFSET; 
    CGFloat yoffset = -CGRectGetMidY(self.centerAnnotationView.bounds) + PIN_HEIGHT_OFFSET; 

    self.centerAnnotationView.center = CGPointMake(mapViewPoint.x + xoffset, 
                mapViewPoint.y + yoffset); 
} 

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated 
{ 
    self.centerAnnotaion.coordinate = mapView.centerCoordinate; 
    [self moveMapAnnotationToCoordinate:mapView.centerCoordinate]; 
} 

@end 

Naprawdę jedyną ciekawą rzeczą jest to, że nie trzeba zrównoważyć MKPinAnnotationView przez pewną kwotę, aby uwzględnić odległości pomiędzy lewym dolnym rogu i główką sworznia. Nie lubię mieć stałych zależnych od zasobów w kodzie, więc jeśli ktokolwiek może znaleźć lepszy sposób na zrobienie tego, ja jestem uszy.

Stworzyłem projekt Github z kontrolerem map, który to robi, a także kilka innych rzeczy związanych z korzystaniem z widoku mapy, aby użytkownik wybrał lokalizację.Sprawdź tutaj: https://github.com/scottrhoyt/CenterPinMapViewController

+0

To jest świetne. Dziękuję Ci. Masz pomysł, jak zablokować zoom na sworzniu? Dlatego podczas powiększania powiększasz tylko kołek, odwrotnie. http://stackoverflow.com/questions/25577813/make-mkmapview-only-zoom-in-on-the-centercoordinate/25577949#25577949 –

0

Swift wersję

W klasie:

var centerAnnotation = MKPointAnnotation() 
var centerAnnotationView = MKPinAnnotationView() 

W viewDidLoad:

if #available(iOS 9.0, *) { 
     centerAnnotationView.pinTintColor = customColor 
    } else { 
     // Fallback on earlier versions 
     centerAnnotationView.pinColor = MKPinAnnotationColor.Red 
    } 
self.view.addSubview(centerAnnotationView) 

W viewDidAppear:

self.moveMapAnnotationToCoordinate(self.mapView.centerCoordinate) 

Następnie :

func moveMapAnnotationToCoordinate(locate : CLLocationCoordinate2D) { 
    let mapViewPoint : CGPoint = self.mapView.convertCoordinate(locate, toPointToView: self.mapView) 
    let pinWidth : CGFloat = 7.75 
    let pinHeight : CGFloat = 7 
    let xOffset : CGFloat = CGRectGetMidX(self.centerAnnotationView.bounds) - pinWidth 
    let yOffset : CGFloat = CGRectGetMidY(self.centerAnnotationView.bounds) - pinHeight 

    self.centerAnnotationView.center = CGPointMake(mapViewPoint.x - xOffset, mapViewPoint.y - yOffset) 
} 

Do korzystania zmianę lokalizacji, dodać delegata CLLocationManagerDelegate a następnie:

func mapView(mapView: MKMapView, regionDidChangeAnimated animated: Bool) { 
    self.centerAnnotation.coordinate = self.mapView.centerCoordinate 
    self.moveMapAnnotationToCoordinate(self.mapView.centerCoordinate) 
} 
Powiązane problemy