как я могу показать компас / заголовок на карте mapkit - PullRequest
8 голосов
/ 13 июня 2010

на iPhone 3GS в приложении «Карты» вы можете щелкнуть значок, который обычно показывает ваше местоположение дважды, а синяя точка получает то, что выглядит как луч от фары, в основном показывая направление, на которое вы смотрите на карте, иповорачивая изображение соответственно.

Доступна ли эта опция с помощью MapKit MapView?

Я знаю, что могу получить свой курс с помощью чего-то вроде

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

// Если точность верна,обработать событие.

if (newHeading.headingAccuracy > 0) {

    CLLocationDirection theHeading = newHeading.magneticHeading;
    ...
}

}

, но я не знаю, как получить такой хороший эффект фары в Mapkit, и, похоже, нет никакой документации.

Есть идеи?

Ответы [ 5 ]

4 голосов
/ 08 февраля 2011

Я нашел решение:

Я поворачиваю карту, используя доступную информацию о курсе с

[mapView setTransform:CGAffineTransformMakeRotation(heading.magneticHeading * M_PI / -180.0)];

Поэтому «луч» всегда указывает на верхнюю часть устройства. Теперь я просто отображаю ImageView поверх карты и меняю его положение в locationManager: didUpdateToLocation: fromLocation:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
        // scroll to new location
    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(newLocation.coordinate, 2000, 2000);
    [self.mapView setRegion:region animated:YES];

        // set position of "beam" to position of blue dot
    self.headingAngleView.center = [self.mapView convertCoordinate:newLocation.coordinate toPointToView:self.view];
        // slightly adjust position of beam
    self.headingAngleView.frameTop -= self.headingAngleView.frameHeight/2 + 8;
 }

, где frameTop и frameHeight являются ярлыками для frame.origin.y и frame.size.height. Он не идеален и иногда ему немного не хватает, когда точка меняет свое положение, но я доволен решением, потому что оно работает.

Взгляните на мою платформу OpenSource MTLocation, которая делает все это (и много других интересных вещей, связанных с Map):

MTLocation

3 голосов
/ 17 ноября 2013

Добавление режима отслеживания пользователей также помогает.Я знаю, что опоздала, но, возможно, помогу другим разработчикам, таким как я:)

self.mapView.userTrackingMode = RMUserTrackingModeFollowWithHeading;
3 голосов
/ 18 марта 2011

Вращающаяся логика других ответов хороша, однако использование методов делегирования менеджера местоположения не приведет к хорошему решению.Изображение «луч» редко будет находиться в том же месте, что и синяя точка, и будет много отскакивать.

Лучшее решение - получить ссылку на представление синей точки и добавить изображение «луч»как подпредставление к нему.Я получил изображение луча в виде квадрата с лучом вверх и прозрачностью вокруг него.Представьте, что синяя точка находится в центре изображения.


// An MKMapViewDelegate method. Use this to get a reference to the blue dot annotation view as soon as it gets added
- (void)mapView:(MKMapView *)aMapView didAddAnnotationViews:(NSArray *)views {

    for (MKAnnotationView *annotationView in views) {

        // Get the user location view, check for all of your custom annotation view classes here
        if (![annotationView isKindOfClass:[MKPinAnnotationView class]])
        {
            self.userLocationAnnotationView = annotationView;
            gotUsersLocationView = YES;
        }
    }
}


// Adds the 'viewPortView' to the annotation view. Assumes we have a reference to the annotation view. Call this before you start listening to for heading events.
- (void)addViewportToUserLocationAnnotationView {
    TTDASSERT(self.userLocationAnnotationView != nil);
    if (self.userLocationAnnotationView == nil) {
        // No reference to the view, can't do anything
        return;
    }

    if (self.viewPortView == nil) {
        self.viewPortView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"map_viewport.png"]] autorelease];
    }

    [self.userLocationAnnotationView addSubview:self.viewPortView];
    [self.userLocationAnnotationView sendSubviewToBack:self.viewPortView];

    self.viewPortView.frame = CGRectMake((-1 * self.viewPortView.frame.size.width/2) + self.userLocationAnnotationView.frame.size.width/2,
                                         (-1 * self.viewPortView.frame.size.height/2) + self.userLocationAnnotationView.frame.size.height/2,
                                         self.viewPortView.frame.size.width,
                                         self.viewPortView.frame.size.height);
}
2 голосов
/ 05 октября 2016

Реализация Swift 3

mapView.userTrackingMode = MKUserTrackingMode.followWithHeading
2 голосов
/ 22 июня 2010

Я мог бы подумать об одном методе, хотя я не реализовал, но может немного помочь вам.

  1. Во-первых, вам нужно изображение с указателем по вашему выбору, этот указатель должен быть направлен вверх на 90 градусов.
  2. Теперь в вашем MapKit отключен маркер текущего местоположения.
  3. В вашем didUpdateHeading используйте значения x и y для вычисления угла направления.
  4. Используйте этоугол поворота изображения указателя
  5. Используйте это повернутое изображение в качестве булавки аннотации на карте.
  6. Вам потребуется часто обновлять положение указателя.

Пожалуйста, оставьте свои предложения / изменения для вышеуказанного подхода.

...