1

私は周りを見回しましたが、この件についてはほとんど見つけることができませんでした. 作成中のアプリに「車を探す」機能を実装しようとしています。

ユーザーが自分の車の位置を保存するために使用できるマップ ビューがあります。「車を探す」をクリックすると、現在地と車が mapView に表示されます。(下記参照)

私の問題: マップを回転させて、ユーザーがどちらを向いているかを示すにはどうすればよいですか? そのため、ユーザーがどの方向に歩く必要があるかを示すことができます。ネイティブ マップ ap によく似ています。

私が行った読書から、これは didUpdateToLocation: デリゲート メソッドで行われると信じていますが、よくわかりません。

マップビュー

(私のユーザーが湖にいることに気付きましたが、それは問題ではありません)

これは、ピンを追加して画面に合わせるために使用したコードです。

古いコード

編集:

コメントで fguchelaar によって提供されたリンクを使用して、何とか機能させることができました。コードを次のように変更しました。このコードは地図を回転させますが、奇妙な動作をします。こちらをご覧ください

- (IBAction)BTNPinCar:(id)sender {


    CLLocation *location = [locationManager location];
    // Configure the new event with information from the location

    float longitude=location.coordinate.longitude;
    float latitude=location.coordinate.latitude;

    NSLog(@"dLongitude : %f", longitude);
    NSLog(@"dLatitude : %f", latitude);

    [self pins:latitude lon:longitude];

    parked.latitude = latitude;
    parked.longitude = longitude;

    //set the reigion to the coords and a mile distance
    MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(parked, startZoom , startZoom );
    //change the region and animate it
    [MapView setRegion:viewRegion animated:YES];



}

- (IBAction)BTNFindCar:(id)sender {

    MKMapRect zoomRect = MKMapRectNull;
    for (id <MKAnnotation> annotation in MapView.annotations)
    {
        MKMapPoint annotationPoint = MKMapPointForCoordinate(annotation.coordinate);
        MKMapRect pointRect = MKMapRectMake(annotationPoint.x, annotationPoint.y, 0.1, 0.1);
        if (MKMapRectIsNull(zoomRect)) {
            zoomRect = pointRect;
        } else {
            zoomRect = MKMapRectUnion(zoomRect, pointRect);
        }
    }
    [MapView setVisibleMapRect:zoomRect animated:YES];\

    // Start heading updates.
    if ([CLLocationManager headingAvailable]) {
        locationManager.headingFilter = 5;
        [locationManager startUpdatingHeading];
    }


}
- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {
   // [MapView setTransform:CGAffineTransformMakeRotation(-1 * newHeading.magneticHeading * M_PI / 180)];
    double rotation = newHeading.magneticHeading * 3.14159 / 180;
    CGPoint anchorPoint = CGPointMake(0, -23); // The anchor point for your pin

    [MapView setTransform:CGAffineTransformMakeRotation(-rotation)];

    [[MapView annotations] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        MKAnnotationView * view = [MapView viewForAnnotation:obj];

        [view setTransform:CGAffineTransformMakeRotation(rotation)];
        [view setCenterOffset:CGPointApplyAffineTransform(anchorPoint, CGAffineTransformMakeRotation(rotation))];

    }];

} 

編集2:

ローテーションの問題を解決しました。

かわった

[MapView setTransform:CGAffineTransformMakeRotation(-rotation)];

為に

[MapView setUserTrackingMode:MKUserTrackingModeFollowWithHeading animated:YES];
4

1 に答える 1

4

マップを回転させるための答えは次のとおりです。

最初にロケーション マネージャーを起動し、デリゲートを設定します。

// locationManager update as location
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;


// Start location services to get the true heading.
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.distanceFilter = kCLDistanceFilterNone;
[locationManager startUpdatingLocation];

上記のコードは、ユーザーの位置の追跡を開始します。次に、マップを回転させるためにユーザーの見出しを追跡し始める必要があります

// Start heading updates.
if ([CLLocationManager headingAvailable]) {
    locationManager.headingFilter = 5;
    [locationManager startUpdatingHeading];
}

その後、LocationManager デリゲート メソッドを実装します。

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading;

最後に、そのデリゲート メソッドで追跡モードを設定します。

[MapView setUserTrackingMode:MKUserTrackingModeFollowWithHeading animated:YES]; 

これが同じ問題を抱えている人に役立つことを願っています

于 2013-01-31T16:20:04.340 に答える