2011-01-02 25 views
3

ピンの色をデフォルトの赤色からカスタム画像に変更しようとしていますが、私が試しているものは何も動作していません。iPhone Mapkitアノテーションにカスタム画像とピンを追加する

私はこのウェブサイトからサンプルコードをダウンロードしている:

http://icodeblog.com/2009/12/21/introduction-to-mapkit-in-iphone-os-3-0/

コードはそれ自身の上で動作しますが、私は私のコードにアノテーションクラスをインポートするとき、彼らは動作しないと私は理由は分かりません。私は他のサイトから数多くの異なるメソッドを試しましたが、ピンの色を変更することさえできません。

私のプロジェクトには4つのタブがあり、MapViewはタブの1つにあります。それを選択すると、JSON文字列が解析され、別々の注釈がマップに追加されます。ピンをクリックするとタイトルとサブタイトルが表示されますが、色や画像は変更できません。ここで

は、私は私の注釈を追加する方法である - MapAnnotationがMKAnnotation、以下: - :

私はビューコントローラでMapView.delegate =自己を持って

ここ
MapAnnotation *ann = [[MapAnnotation alloc] initWithCoordinate:newCoord]; 
    ann.title = [locationDictionary objectForKey:@"name"]; 
    ann.subtitle = [locationDictionary objectForKey:@"name"]; 

    [mapView addAnnotation:ann]; 
    [ann release] 

は、色を変更する方法を私がしようとする試みであります

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{ 
MKPinAnnotationView *pin = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:[annotation title]]; 

if (pin == nil) { 
    pin = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:[annotation title]] autorelease]; 
}else { 
    pin.annotation = annotation; 
} 

pin.pinColor = MKPinAnnotationColorGreen; 
pin.animatesDrop = YES; 
pin.canShowCallout = TRUE; 
return pin; 

}

私だけではない、緑のマーカー、注釈はタイトルとサブタイトルに表示されるように取得します。彼らはいつも私は色やイメージを使用して赤色です。もし誰かが私を助けることができたら、それは素晴らしいだろう!

おかげ

EDIT:

のMapViewデリゲートはviewDidLoadメソッドに割り当てられています。また、マップの特定の部分にオーバーレイを追加します。これは正常に動作している、私はまたそれを取り出して、それが問題を引き起こしていたincaseそれを試みたが、まだそれを修正していない。

- (void)viewDidLoad { 
[super viewDidLoad]; 

MKCoordinateRegion cordRgn; 

LusuAppAppDelegate *delegate =[[UIApplication sharedApplication]delegate]; 

if (delegate.CurrentLocation == 0) { 
    cordRgn.center.latitude = (CENTRE_OF_POSITION_2_LAT); 
    cordRgn.center.longitude = (CENTRE_OF_POSITION_2_LON); 
    delegate.CurrentLocation = 1; 
}else if (delegate.CurrentLocation == 1) { 
    cordRgn.center.latitude = (CENTRE_OF_POSITION_1_LAT); 
    cordRgn.center.longitude = (CENTRE_OF_POSITION_1_LON); 
    delegate.CurrentLocation = 0; 
} 

cordRgn.span.latitudeDelta = 0.009f; 
cordRgn.span.longitudeDelta = 0.009f; 


self.locationManager = [[CLLocationManager alloc] init]; 
locationManager.delegate = self; 
locationManager.desiredAccuracy = kCLLocationAccuracyBest; 

[locationManager startUpdatingLocation]; 
[locationManager startUpdatingHeading]; 

//add overlay 
MKRasterOverlay *overlay = [[MKRasterOverlay alloc] init]; 
[overlay setCoordinate:CLLocationCoordinate2DMake(54.005508, -2.780507)]; 

MKMapRect mkrect; 
MKMapPoint mkpointa, mkpointb; 
mkrect.origin = MKMapPointForCoordinate(CLLocationCoordinate2DMake(54.016964, -2.794862)); 
mkpointa = MKMapPointForCoordinate(CLLocationCoordinate2DMake(54.016964, 2.000000)); 
mkpointb = MKMapPointForCoordinate(CLLocationCoordinate2DMake(54.001447, 2.013770)); 
mkrect.size.width = mkpointb.x - mkpointa.x; 
mkrect.size.height = mkpointb.y - mkpointa.y; 
overlay.boundingMapRect = mkrect; 

mapView.delegate = self; 

[mapView addOverlay:overlay]; 
[mapView setRegion:cordRgn animated:NO]; 
[self.mapView setShowsUserLocation:YES]; 

[self doAnnotations]; 

}

doAnnotations関数は、上記が、ループに示すコードです。あなたの助けをもう一度ありがとう。

答えて

7

あなたのコードは私にはうまく見えます。代理人の割り当てに間違いがあり、mapView:viewForAnimationが実際に呼び出されていないと思われます。その関数を提供するデリゲートのないMKMapViewは、すべてのアノテーションの赤いピンでうまく動作します。 NSLogステートメントを追加するか、デバッガでブレークポイントを設定して、実際にこのコードを実行していることを確認してください。

あなたはすでにこれを知っているかもしれませんが、自分のイメージを使用するにはMKAnnotationPinViewではなくMKAnnotationView sのピンを作成する必要があります。

+0

ええ、実際には呼び出されていません。私は何が間違っていますか?私はコード内にmapView.delegate = selfを持っていますが、例から私が見ることのできる違いは、mapView.delegate = nilを持つdeallocの場合だけです。しかし、その行がなければ、私はエラーが発生します。それは問題ではありませんか? – omniscian

+0

dealloc行を関連付けるべきではありません。デリゲートプロパティを代入する関数を表示して、そこに何かを見つけることができます。 –

+0

元の投稿を修正して、代理人の設定方法を含めました。これは、viewDidLoadメソッドで行われます。再度、感謝します。 – omniscian

関連する問題