在地图图钉Xcode

时间:2016-11-07 12:08:09

标签: ios objective-c iphone xcode mkmapview

我正在使用objective-c在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:@"pin@2x.png"];
    }
    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

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:2)

您需要在viewDidLoad方法中编写以下代码,因为当mapview&#39; delegate方法viewForAnnotation调用时,图像会在引脚上显示。

只需在vc加载时配置mapView。

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];

答案 1 :(得分:0)

在.h文件中创建自定义Annotaion类

#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

im .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

中的回答