2011-04-24 16 views
7

私は、ユーザーの場所のカスタム・MKAnnotationView作成しました:MKUserLocationカスタムビューが動かない!

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

{

if ([annotation isKindOfClass:[MKUserLocation class]]) { 

    if (navStatus == NavStatusHeadingEnabled) { 

     if ([annotation isKindOfClass:[MKUserLocation class]]) { 

      locationView = [[CustomLocationView alloc] initWithAnnotation:annotation reuseIdentifier:@"locationIdentifier"]; 
      return locationView; 

     } 

    } 

    return nil; 

} 

CustomLocationView.hを

 - (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier 
    { 
     self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]; 
     if (self != nil) 
     { 


      self.backgroundColor = [UIColor clearColor]; 
      blueDot = [UIImage imageNamed:@"userLocationDot.png"].CGImage; 
      CGImageRetain(blueDot); 

      CGPoint blueDotCenter = CGPointMake((self.frame.size.width - (CGImageGetWidth(blueDot)/2))/2, (self.frame.size.height - (CGImageGetHeight(blueDot)/2))/2); 

      blueDotLayer = [CALayer layer]; 
      blueDotLayer.frame = CGRectMake(blueDotCenter.x, blueDotCenter.y , CGImageGetWidth(blueDot)/2, CGImageGetHeight(blueDot)/2); 
      blueDotLayer.contents = (id)blueDot; 
      blueDotLayer.shadowOpacity = 0.4; 
      blueDotLayer.shadowColor = [UIColor blackColor].CGColor; 
      blueDotLayer.shadowOffset = CGSizeMake(0.4, 0.3); 
      blueDotLayer.shadowRadius = 1.0f; 

      [self.layer insertSublayer:blueDotLayer above:self.layer]; 

     } 

     return self; 
    } 

- (void)setAnnotation:(id <MKAnnotation>)annotation 
{ 
    [super setAnnotation:annotation]; 

    [self setNeedsDisplay]; 
} 





- (void)dealloc { 

    [blueDotLayer release]; 


    [super dealloc]; 
} 

問題はそれだけで同じ場所にとどまると移動ではありません青い点のように。 私は間違っていますか?

ありがとうございます。 ビル。

+0

ためです。 'CLLocationManager'を使わずにそれを処理する方法はありますか? – anticyclope

答えて

0

ビル、

あなたは、適用desiredAccuracyとdistanceFilterで初期化し、次に該当するデリゲートメソッドを実装し、locationManagerインスタンスに委譲として独自のコードを設定されているCLLocationManagerを必要としています。

少なくとも、現在の場所がdesiredAccuracyで決まると、Location Managerが呼び出す次の方法を使用し、distanceFilterが満たされるたびに再度呼び出す必要があります。私も今この問題に遭遇した

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation ; 

乾杯、 マック

+0

こんにちはマック、あなたの答えをありがとう。私はすでにCLLocationManagerデリゲートを実装しています。青い点があり、正しく更新されています。私の問題は、(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id をチェックして([annotation isKindOfClass:[MKUserLocation class]))を使用してカスタムAnnotationViewを青い点に置き換えると、青い点は私のカスタムビューではなく、もはや更新されていない、それはちょうど同じ場所にまだ立っている。 – Nimrod7

5

。私はこれが予想される動作かどうかはわかりませんが、何らかの理由でカスタムMKUserLocation注釈ビューを移動するのは私たちの責任です。

素朴な解決策は

- (void) locationController: (LocationController *) locationController 
     didUpdateToLocation: (CLLocation *) location 
{ 
    [[self mapView] setShowsUserLocation:NO]; 

    [[self mapView] setShowsUserLocation:YES]; 
} 

である。しかし、これは私が望ましくない見つけ、画面の周りに現在の場所注釈ジャンプします。まだ

ベターはあなたのビューコントローラにIVARとしてカスタム注釈ビューへの参照を保持することで、その後の操作を行います。

- (void) locationController: (LocationController *) locationController 
     didUpdateToLocation: (CLLocation *) location 
{ 
    CGPoint newCenterPoint = [[self mapView] convertCoordinate:[location coordinate] toPointToView:[[self customAnnotationView] superview]]; 
    newCenterPoint.x += [[self customAnnotationView] centerOffset].x; 
    newCenterPoint.y += [[self customAnnotationView] centerOffset].y; 

    [UIView animateWithDuration:0.3f animations:^{ 
     [[self customAnnotationView] setCenter:newCenterPoint]; 
    }]; 

} 

これは、あなたはそれがあった場所注釈がままズームレベルを変更する場合を除いて良いですズームまたはパンが完了した後にのみ、マップビューのrectを基準にして、正しい位置にアニメートされます。 Appleの主導に従って、現在地の注釈を消して地域の変更中に再び表示させることをおすすめします。

- (void)mapView:(MKMapView *)mapView regionWillChangeAnimated:(BOOL)animated 
{ 
    [[self mapView] setShowsUserLocation:NO]; 
} 

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated 
{ 
    [[self mapView] setShowsUserLocation:YES]; 
} 
0

この問題の回答が見つかりました。私のコードはモノトゥッチですが、ObjCで同じコードをやり直すのは簡単です。 デフォルトの画像にカスタマイズされた画像を表示するには、元の画像の上にサブビューを追加する必要があります。MKUserLocationこれを行うには、MKMapViewデリゲート

void DidAddAnnotationViews (object sender, MKMapViewAnnotationEventArgs e) 
{ 
      MKAnnotationView v = mapView.ViewForAnnotation(mapView.UserLocation); 
      if(v != null) 
      { 
       if(v.Subviews.Count() == 0) 
       { 
        UIImageView iv = new UIImageView(new RectangleF(0,0, 22, 22)); 
        iv.Image = UIImage.FromFile("res/pins/Yhere.png"); 
        v.AddSubview(iv); 
        v.BringSubviewToFront(iv); 
       } 
      } 
} 

これは、青い点の上に移動し、カスタムイメージを与えるにDidAddAnnotationViewsをオーバーライドします。さらに多くのユーザー追跡機能と位置情報更新機能が完璧に機能し、場所の正確さを示す青い円が表示されます。

MKUserLocationのカスタマイズが楽しいです!ここで

0

は、Appleの開発者向け技術サポート

からの回答である私はちょうどMapKitのエンジニアと話を終えて、彼らは、これはiOSのバグであることを確認しました。 テストアプリに同じ問題が発生しています。これはiOSの6に固定された場合、私は知らない

は、答えはただ、この問題が発生したのiOS 5

関連する問題