2014-09-02 23 views
0

我一直在尋找相當多的東西,而且我還沒有真正找到好的答案。 我試圖改變管腳在幾個不同位置的顏色(1個紅,1紫色..)在不同位置更改地圖引腳的顏色

我有一個單獨的註記類 pinPlaceMark.h #進口 #進口

@interface PinPlaceMark : NSObject <MKAnnotation> 

@property(nonatomic, readwrite) CLLocationCoordinate2D coordinate; 
@property(nonatomic, strong) NSString *myTitle; 
@property(nonatomic, strong) NSString *mySubTitle; 

- (id) initWithCoordinate: (CLLocationCoordinate2D) coordinate; 
@end 

pinPlaceMark.m

#import "PinPlaceMark.h" 

@implementation PinPlaceMark 

- (id) initWithCoordinate:(CLLocationCoordinate2D)coordinate 
{ 
self = [super init]; 
if (self) 
{ 
    self.coordinate = coordinate; 
} 
return self; 
} 

- (NSString *) subtitle 
{ 
return self.mySubTitle; 
} 

- (NSString *) title 
{ 
return self.myTitle; 
} 
@end 

mapViewController.h

#import <UIKit/UIKit.h> 
#import <MapKit/MapKit.h> 
#import "PinPlaceMark.h" 
@interface MapViewController : UIViewController <MKMapViewDelegate> 
@property (nonatomic, strong) IBOutlet MKMapView *mapView; 

mapViewController.m

- (void) addPinWithCoordinate: (CLLocationCoordinate2D) pinLocation 
{ 
PinPlaceMark *placeMark = [[PinPlaceMark alloc] initWithCoordinate:pinLocation]; 

placeMark.myTitle = @"This is my title"; 
placeMark.mySubTitle = @"This is my subtitle"; 

[self.mapView addAnnotation:placeMark]; 
} 


- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
self.mapView.delegate = self; 
CLLocationCoordinate2D pinLocation1; 
pinLocation1.latitude = 40.7101843; 
pinLocation1.longitude = -74.0061474; 
[self addPinWithCoordinate:pinLocation1]; 
} 
- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation 
    MKPinAnnotationView *pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"id"]; 
pinView.pinColor = MKPinAnnotationColorPurple; 
return pinView; 

只是一種顏色。 我該如何着手改變不同位置的顏色 我試着創建MKPinAnnotationView的另一個實例並根據座標返回它,但它不適合我。

感謝您提供的任何幫助。

+0

您能否介紹一下您的註釋是如何創建的以及它們的屬性是什麼? – pbasdf 2014-09-02 18:48:13

+0

我更新了問題。謝謝 – MendyK 2014-09-02 19:03:27

+1

請參閱http://stackoverflow.com/questions/24215210/does-mkannotationview-buffer-its-input-queue。你並不是真的想要在「座標上」引用顏色,而是在每個註釋的其他不同屬性上(你可以在你的PinPlaceMark類中添加一個「pinColor」屬性,在添加註釋時設置它,在viewForAnnotation從註解的pinColor屬性設置視圖的pinColor – Anna 2014-09-02 19:06:28

回答

1

這裏是我的建議的例子...

首先,銷顏色屬性添加到您的自定義註解類PinPlaceMark,您可以設置每個引腳的顏色單獨。該屬性應該在實現MKAnnotation(模型對象)的類中。該屬性沒有被「腳色」 - 只是具體到每一個註釋,這將可以很容易地決定什麼針顏色視圖設置爲viewForAnnotation一些值:

@property (nonatomic, assign) MKPinAnnotationColor myPinColor; 


接下來,更新addPinWithCoordinate:方法(因爲這是你創建的PinPlaceMark實例)接受銷的顏色,並將其設置:

- (void) addPinWithCoordinate:(CLLocationCoordinate2D)pinLocation 
         color:(MKPinAnnotationColor)pinColor //<-- new 
{ 
    PinPlaceMark *placeMark = [[PinPlaceMark alloc] initWithCoordinate:pinLocation]; 

    placeMark.myTitle = @"This is my title"; 
    placeMark.mySubTitle = @"This is my subtitle"; 

    placeMark.myPinColor = pinColor; //<-- new 

    [self.mapView addAnnotation:placeMark]; 
} 


下一步,更新調用addPinWithCoordinate:的代碼。實施例還示出了被添加具有不同顏色的多個引腳:

CLLocationCoordinate2D pinLocation1; 
pinLocation1.latitude = 40.7101843; 
pinLocation1.longitude = -74.0061474; 
[self addPinWithCoordinate:pinLocation1 color:MKPinAnnotationColorGreen]; 

CLLocationCoordinate2D pinLocation2 = CLLocationCoordinate2DMake(41, -75); 
[self addPinWithCoordinate:pinLocation2 color:MKPinAnnotationColorRed]; 

CLLocationCoordinate2D pinLocation3 = CLLocationCoordinate2DMake(32, -80); 
[self addPinWithCoordinate:pinLocation3 color:MKPinAnnotationColorPurple]; 

CLLocationCoordinate2D pinLocation4 = CLLocationCoordinate2DMake(50, -90); 
[self addPinWithCoordinate:pinLocation4 color:MKPinAnnotationColorGreen]; 

CLLocationCoordinate2D pinLocation5 = CLLocationCoordinate2DMake(40, -120); 
[self addPinWithCoordinate:pinLocation5 color:MKPinAnnotationColorRed]; 

CLLocationCoordinate2D pinLocation6 = CLLocationCoordinate2DMake(45, -100); 
[self addPinWithCoordinate:pinLocation6 color:MKPinAnnotationColorPurple]; 


最後,更新viewForAnnotation委託方法來檢查註釋是PinPlaceMark類型的,並且使用其myPinColor屬性:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation 
{ 
    if (! [annotation isKindOfClass:[PinPlaceMark class]]) { 
     //if annotation is not a PinPlaceMark (eg. user location), 
     //return nil so map view draws default view (eg. blue dot) for it... 
     return nil; 
    } 

    static NSString *reuseId = @"id"; 

    MKPinAnnotationView *pinView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:reuseId]; 
    if (pinView == nil) { 
     pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseId]; 
     pinView.canShowCallout = YES; 
    } 
    else { 
     pinView.annotation = annotation; 
    } 

    //Set annotation-specific properties **AFTER** 
    //view is dequeued or created... 

    PinPlaceMark *ppm = (PinPlaceMark *)annotation; 
    pinView.pinColor = ppm.myPinColor; 

    return pinView; 
} 
+0

非常感謝您解釋它! Theres只是一件事,我沒有真正得到(可能是編程中的b/c):'MKPinAnnotationView * pinView =(MKPinAnnotationView *)'在這種情況下,(MKPinAnnotationView *)究竟做了什麼? – MendyK 2014-09-05 04:03:02

+0

這是一個類型演員。 dequeueReusableAnnotationViewWithIdentifier方法被定義爲返回一些視圖,它是MKAnnotationView的子類。但是我們知道我們只創建MKPinAnnotationView(MKAnnotationView的一個子類)對象,並且pinView被聲明爲該類型。如果我們沒有鍵入,編譯器會抱怨類型不匹配,但我們會告訴它「沒關係」。 – Anna 2014-09-05 10:39:28

0

要達到此目的,您可能會生成隨機彩色圖像並將其分配給MKPinAnnotationView。雖然我沒有在我的MAC上嘗試過,但它應該可以工作。

下面是相同的源代碼:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation { 

MKPinAnnotationView *pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"id"]; 

// Code for random color 

CGFloat hue = (arc4random() % 256/256.0); // 0.0 to 1.0 
CGFloat saturation = (arc4random() % 128/256.0) + 0.5; // 0.5 to 1.0, away from white 
CGFloat brightness = (arc4random() % 128/256.0) + 0.5; // 0.5 to 1.0, away from black 
UIColor *color = [UIColor colorWithHue:hue saturation:saturation brightness:brightness alpha:1]; 

UIImage * image = [self imageWithColor:color]; 
UIImageView *imageView = [[[UIImageView alloc] initWithImage:image] autorelease]; 
[pinView addSubview:imageView]; 
return pinView; 

} 

- (UIImage *)imageWithColor:(UIColor *)color{ 

    CGRect rect = CGRectMake(0.0f, 0.0f, 10.0f, 10.0f); 
    UIGraphicsBeginImageContext(rect.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGContextSetFillColorWithColor(context, [color CGColor]); 
    CGContextFillRect(context, rect); 

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return image; 
} 
+0

感謝您的代碼,但我一直在尋找更基本的東西,我只是想改變地圖上不同引腳的顏色,使用默認的ios顏色。初學者和那個委託方法「viewForAnnotation」很混淆 – MendyK 2014-09-04 14:43:29

+0

「viewForAnnotation」是MKMapViewDelegate的非常基本的委託方法。假設你有n麻木呃標記/地圖引腳被繪製在地圖上,那麼這個委託方法將被調用n次。 – Paresh 2014-09-04 15:17:03

+0

按什麼順序? ...出於某種原因,這比我所有其他委託方法對我來說都更加困惑。 – MendyK 2014-09-04 15:26:51

0
#import <UIKit/UIKit.h> 
#import <MapKit/MapKit.h> 
#import "MyAnnotation.h" 
@interface MainViewController : UIViewController<MKMapViewDelegate> 
{ 
    NSMutableArray *annotationArray; 
    int i; 
} 
@property (weak, nonatomic) IBOutlet MKMapView *mapView; 

@end 
@implementation MainViewController 

    @synthesize mapView; 
     - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
    { 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
    } 
- (void)viewDidLoad 
    { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 
    [email protected]"Machine Test"; 
    mapView.delegate=self; 
     i=1; //use for different colors of pins 
    annotationArray = [[NSMutableArray alloc] init]; 
    // Do any additional setup after loading the view from its nib. 

    //Annotation object1 
     MyAnnotation *ann1 = [MyAnnotation new]; 
     [email protected]"Pune"; 
     [email protected]"India"; 
     CLLocationCoordinate2D Cordinate1; 
     Cordinate1.latitude = 18.; 
     Cordinate1.longitude = 73.5; 
     ann1.coordinate = Cordinate1; 
     [annotationArray addObject:ann1]; 

    //Annotation object2 
     MyAnnotation *ann2=[MyAnnotation new]; 
     [email protected]"Delhi"; 
     [email protected]"India"; 
     CLLocationCoordinate2D Coordinate2; 
     Coordinate2.latitude=25; 
     Coordinate2.longitude=78; 
     ann2.coordinate=Coordinate2; 
     [annotationArray addObject:ann2]; 

    //Annotation object3 
     MyAnnotation *ann3=[MyAnnotation new]; 
     ann3[email protected]"Hyderabad"; 
     [email protected]"India"; 
     CLLocationCoordinate2D Coordinate3; 
     Coordinate3.latitude=18.5; 
     Coordinate3.longitude=78; 
     ann3.coordinate=Coordinate3; 
     [annotationArray addObject:ann3]; 

    //Annotation Object4 
     MyAnnotation *ann4=[MyAnnotation new]; 
     [email protected]"Himalaya"; 
     [email protected]"India"; 
     CLLocationCoordinate2D Coordinate4; 
     Coordinate4.latitude=28; 
     Coordinate4.longitude=80; 
     ann4.coordinate=Coordinate4; 
     [annotationArray addObject:ann4]; 

    //Add all annotation objects in 1 array and pass for adding annotation 
    [mapView addAnnotations:annotationArray]; 

    } 
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation 
{ 

    static NSString *AnnotationIdentifier = @"AnnotationIdentifier"; 
    MKPinAnnotationView *pinView = [[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier]; 
    pinView.animatesDrop = YES; 
    pinView.canShowCallout = YES; 
     if (i==1) { 
      pinView.pinColor = MKPinAnnotationColorPurple; 
      i++; 
     }else if (i%2) { 
      pinView.pinColor = MKPinAnnotationColorGreen; 
      i++; 
     }else{ 
      pinView.pinColor = MKPinAnnotationColorRed; 
      i++; 
     } 
    return pinView; 
} 
- (void)didReceiveMemoryWarning 
    { 
     [super didReceiveMemoryWarning]; 
     // Dispose of any resources that can be recreated. 
    } 
@end; 
#import <Foundation/Foundation.h> 
#import <MapKit/MapKit.h> 
@interface MyAnnotation : NSObject<MKAnnotation> 
@property (copy, nonatomic)NSString *title; 
@property (copy, nonatomic)NSString *subtitle; 
@property (assign, nonatomic)CLLocationCoordinate2D coordinate; 
@end 

    objMain=[[MainViewController alloc]initWithNibName:@"MainViewController" bundle:nil]; 
    objNav=[[UINavigationController alloc]initWithRootViewController:objMain]; 
    [self.window addSubview:objNav.view]; 
+1

與分享/更正代碼一樣好,留下一些有用的文本也是一種很好的做法,以便正在經歷的人可以確切知道哪些糾正措施。 – 2015-03-06 13:26:56