2016-11-07 1 views
1

Я разрабатываю приложение в Xcode с помощью объектива-c. Моя проблема в том, что я пытаюсь изменить исходный красный вывод карты для пользовательского изображения. У меня есть код, но вывод изображения появляется только при нажатии кнопки локации. Я хочу, чтобы изображение пользовательского вывода отображалось при загрузке карты. Я искал помощь в Интернете, но я не знаю, как это сделать в моем случае.Использование изображения на карте pin Xcode

Может кто-нибудь мне помочь? Спасибо!

Мой RestMapPin.h:

#import <Foundation/Foundation.h> 
#import <MapKit/MapKit.h> 

@interface RestMapPin : NSObject <MKAnnotation> { 

    CLLocationCoordinate2D coordinate; 
    NSString *title; 
    NSString *subtitle; 
} 

@property (nonatomic, assign) CLLocationCoordinate2D coordinate; 
@property (nonatomic, copy) NSString *title; 
@property (nonatomic, copy) NSString *subtitle; 

@end 

Мой RestMapPin.m

#import "RestMapPin.h" 

@implementation RestMapPin 

@synthesize coordinate, title, subtitle; 

@end 

Мой MapViewController.h

#import <UIKit/UIKit.h> 
#import <MapKit/MapKit.h> 

@interface MapViewController : UIViewController { 

    MKMapView *mapView; 
} 

@property (weak, nonatomic) IBOutlet UIBarButtonItem *barButton; 

@property (nonatomic, retain) IBOutlet MKMapView *mapView; 
@property(nonatomic, retain) CLLocationManager *locationManager; 

-(IBAction)setMap:(id)sender; 

-(IBAction)GetLocation:(id)sender; 

@end 

Мой MapViewController.m

#import "MapViewController.h" 
#import "SWRevealViewController.h" 
#import "RestMapPin.h" 

@interface MapViewController() 

@end 

@implementation MapViewController 

@synthesize mapView; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    _barButton.target = self.revealViewController; 
    _barButton.action = @selector(revealToggle:); 

    [self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer]; 

    [self.navigationItem setTitle:@"Mapa"]; /*Cambia el titulo del navigation controller*/ 

    [self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor whiteColor]}]; /*Cambia el color de las letras del navigation controller bar del menu principal*/ 

    [self.navigationController.navigationBar setBarTintColor:[UIColor colorWithRed:27/255.0f green:101/255.0f blue:163/255.0f alpha:1.0f]]; 

    self.navigationController.navigationBar.tintColor = [UIColor whiteColor]; /*Cambia el color del boton de la izquierda*/ 

    /*80 Grados*/ 
    MKCoordinateRegion region_80_grados = { {0.0, 0.0}, {0.0, 0.0}}; 
    region_80_grados.center.latitude = 40.42871179999999; 
    region_80_grados.center.longitude = -3.703639100000032; 
    region_80_grados.span.longitudeDelta = 0.1f; 
    region_80_grados.span.latitudeDelta = 0.1f; 
    [mapView setRegion:region_80_grados animated:YES]; 

    RestMapPin *ann_80_grados = [[RestMapPin alloc] init]; 
    ann_80_grados.title = @"80 Grados"; 
    ann_80_grados.subtitle = @"Malasaña"; 
    ann_80_grados.coordinate = region_80_grados.center; 
    [mapView addAnnotation:ann_80_grados]; 

    /*90 Grados*/ 
    MKCoordinateRegion region_90_grados = { {0.0, 0.0}, {0.0, 0.0}}; 
    region_90_grados.center.latitude = 40.4164161; 
    region_90_grados.center.longitude = -3.6699459999999817; 
    region_90_grados.span.longitudeDelta = 0.1f; 
    region_90_grados.span.latitudeDelta = 0.1f; 
    [mapView setRegion:region_90_grados animated:YES]; 

    RestMapPin *ann_90_grados = [[RestMapPin alloc] init]; 
    ann_90_grados.title = @"90 Grados"; 
    ann_90_grados.subtitle = @"Retiro"; 
    ann_90_grados.coordinate = region_90_grados.center; 
    [mapView addAnnotation:ann_90_grados]; 

    /*Barra de Pintxos 3*/ 
    MKCoordinateRegion region_barra_de_pintxos3 = { {0.0, 0.0}, {0.0, 0.0}}; 
    region_barra_de_pintxos3.center.latitude = 40.4364001; 
    region_barra_de_pintxos3.center.longitude = -3.680874499999959; 
    region_barra_de_pintxos3.span.longitudeDelta = 0.1f; 
    region_barra_de_pintxos3.span.latitudeDelta = 0.1f; 
    [mapView setRegion:region_barra_de_pintxos3 animated:YES]; 

    RestMapPin *ann_barra_de_pintxos3 = [[RestMapPin alloc] init]; 
    ann_barra_de_pintxos3.title = @"BaRRa de Pintxos"; 
    ann_barra_de_pintxos3.subtitle = @"Barrio de Salamanca"; 
    ann_barra_de_pintxos3.coordinate = region_barra_de_pintxos3.center; 
    [mapView addAnnotation:ann_barra_de_pintxos3]; 

} 

-(MKAnnotationView *)mapView:(MKMapView *)mV viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    MKAnnotationView *pinView = nil; 
    if(annotation != mapView.userLocation) { 
     static NSString *defaultPinID = @"com.invasivecode.pin"; 
     pinView = (MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID]; 
     if (pinView == nil) 
      pinView = [[MKAnnotationView alloc] 
         initWithAnnotation:annotation reuseIdentifier:defaultPinID]; 


     pinView.canShowCallout = YES; 
     pinView.image = [UIImage imageNamed:@"[email protected]"]; 
    } 
    else { 
     //[mapView.userLocation setTitle:@"I am here"]; 
    } 
    return pinView; 
} 



-(IBAction)setMap:(id)sender { 

    switch (((UISegmentedControl *) sender).selectedSegmentIndex) { 
     case 0: 
      mapView.mapType = MKMapTypeStandard; 
      break; 
     case 1: 
      mapView.mapType = MKMapTypeSatellite; 
      break; 
     case 2: 
      mapView.mapType = MKMapTypeHybrid; 
      break; 
     default: 
      break; 
    } 
} 


/*Obtener la localización. Código adaptado para funcionar en iOS8*/ 
-(IBAction)GetLocation:(id)sender { 


    mapView.delegate = self; 
    self.locationManager = [[CLLocationManager alloc] init]; 
    self.locationManager.delegate = self; 

    [self.locationManager requestWhenInUseAuthorization]; 

    [self.locationManager startUpdatingLocation]; 

    mapView.showsUserLocation = YES; 
    [mapView setMapType:MKMapTypeStandard]; 
    [mapView setZoomEnabled:YES]; 
    [mapView setScrollEnabled:YES]; 

    /***************************************/ 

    [super viewDidAppear:YES]; 

    self.locationManager.distanceFilter = kCLDistanceFilterNone; 
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
    [self.locationManager startUpdatingLocation]; 
    NSLog(@"%@", [self deviceLocation]); 

    //View Area 
    MKCoordinateRegion region = { { 0.0, 0.0 }, { 0.0, 0.0 } }; 
    region.center.latitude = self.locationManager.location.coordinate.latitude; 
    region.center.longitude = self.locationManager.location.coordinate.longitude; 
    region.span.longitudeDelta = 0.001f; 
    region.span.longitudeDelta = 0.001f; 
    [mapView setRegion:region animated:YES]; 
} 

- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation 
{ 
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(userLocation.coordinate, 800, 800); 
    [self.mapView setRegion:[self.mapView regionThatFits:region] animated:YES]; 
} 
- (NSString *)deviceLocation { 
    return [NSString stringWithFormat:@"latitude: %f longitude: %f", self.locationManager.location.coordinate.latitude, self.locationManager.location.coordinate.longitude]; 
} 
- (NSString *)deviceLat { 
    return [NSString stringWithFormat:@"%f", self.locationManager.location.coordinate.latitude]; 
} 
- (NSString *)deviceLon { 
    return [NSString stringWithFormat:@"%f", self.locationManager.location.coordinate.longitude]; 
} 
- (NSString *)deviceAlt { 
    return [NSString stringWithFormat:@"%f", self.locationManager.location.altitude]; 
} 

@end 

Большое спасибо за помощь!

+0

то где код кнопки локации? – vaibhav

+0

Вы пытались установить область на разных широтах и ​​долготе, а не {{0.0, 0.0}, {0.0, 0.0}}? –

ответ

2

Вам нужно написать следующий код внутри viewDidLoad метода, потому что изображение наносится на штифт, когда delegate метод MAPview в viewForAnnotation называется.

Просто настройте mapView первым, когда vc загрузится.

mapView.delegate = self; 
self.locationManager = [[CLLocationManager alloc] init]; 
self.locationManager.delegate = self; 

[self.locationManager requestWhenInUseAuthorization]; 

[self.locationManager startUpdatingLocation]; 

mapView.showsUserLocation = YES; 
[mapView setMapType:MKMapTypeStandard]; 
[mapView setZoomEnabled:YES]; 
[mapView setScrollEnabled:YES]; 
+0

Это отлично работает для меня! Спасибо! –

+0

@ DanielFernandez добро пожаловать дорогой. – vaibhav

0

Создать свой собственный класс Annotaion в файле .h

#import <Foundation/Foundation.h> 
#import <MapKit/MapKit.h> 

@interface LocationAnnotaion : NSObject<MKAnnotation> 
@property NSString * titile; 
@property (nonatomic, readonly)CLLocationCoordinate2D coordinate; 
-(id)initWithTitile:(NSString*) titile AndCoOrdinate:(CLLocationCoordinate2D) locationCoordinate; 
-(MKAnnotationView*)annotationView; 
@end 

им .m файл записи:

@implementation LocationAnnotaion 
-(id)initWithTitile:(NSString *)titile AndCoOrdinate:(CLLocationCoordinate2D)locationCoordinate 
{ 
    if (self = [super init]) 
    { 
     _titile = titile; 
     _coordinate= locationCoordinate; 
    } 
    return self; 
} 
-(MKAnnotationView*)annotationView 
{ 
    MKAnnotationView * annotationView = [[MKAnnotationView alloc]initWithAnnotation:self reuseIdentifier:@"LocationAnnotation"]; 
    annotationView.enabled = YES; 
    // annotationView.canShowCallout = YES; 
    annotationView.image = [UIImage imageNamed:@"location_sign_map"]; 
    return annotationView; 
} 
@end 

Добавить аннотацию к просмотру карты

LocationAnnotaion *annotation = [[LocationAnnotaion alloc]initWithTitile:LOCATION_TEXT AndCoOrdinate:your_coordinate]; 
    [mapLocationView addAnnotation:annotation]; 

и в MAPview делегата оных

-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation 
{ 
    if ([annotation isKindOfClass:[CCLocationAnnotaion class]]) 
    { 
     CCLocationAnnotaion * myAnnotation = (CCLocationAnnotaion*)annotation; 
     MKAnnotationView * view = myAnnotation.annotationView; 
     view.centerOffset = CGPointMake(0, -view.image.size.height/2); 
     return view; 
    } 
    return nil; 
} 

Надеюсь, это поможет.

мой ответ от вопроса https://stackoverflow.com/posts/40213933

Смежные вопросы