Отключить компас на MKMapView

Я использую MapView в своем приложении, чтобы показать некоторые аннотации. В iOS 7 на карте случайно отображается компас. Я не могу воспроизвести ошибку, потому что она появляется случайным образом, но я хочу ее отключить. Любые идеи о том, как отключить его?

Обновление: я узнал, что это не случайно, а конкретным жестом. Когда вы используете 2 пальца и сдвиньте один правый, а другой - влево.

Ответ 1

Вы можете легко отключить компас на OSX 10.9/iOS 9 и более поздних версиях с помощью свойства showsCompass:

yourMapView.showsCompass = NO;

На iOS 8 или более ранних версиях ваши варианты:

Мне непонятно, почему Apple так долго ждала, чтобы скрывать компас на iOS, и ни один из вышеперечисленных вариантов не идеален. Выберите то, что вы считаете наименее плохим в своем случае.

Ответ 2

Я нашел решение вашей проблемы, используя идею Mark Amery о пересечении подкадров экземпляра MKMapView, чтобы найти компас, а также использование распознавания жестов для запуска события удаления.

Чтобы найти компас, я распечатал описание представлений и обнаружил, что одним из представлений был экземпляр MKCompassView, это был, очевидно, компас.

Я придумал следующий код, который должен работать для вас. Он проверяет жест вращения, а затем удаляет представление в методе, вызванном событием жестов.

Я тестировал этот метод, и он хорошо работает для меня:

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIRotationGestureRecognizer *rotateGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotate:)];

    [self.mapView addGestureRecognizer:rotateGesture];
}

-(void)rotate:(UIRotationGestureRecognizer *)gesture
{
    if ([gesture state] == UIGestureRecognizerStateBegan || [gesture state] == UIGestureRecognizerStateChanged) {
        // Gets array of subviews from the map view (MKMapView)
        NSArray *mapSubViews = self.mapView.subviews;

        for (UIView *view in mapSubViews) {
            // Checks if the view is of class MKCompassView
            if ([view isKindOfClass:NSClassFromString(@"MKCompassView")]) {
                // Removes view from mapView
                [view removeFromSuperview];
            }
        }
    }
}

Ответ 3

Создайте обертку UIView с кадром, который требуется для вашей карты, и clipsToBounds установите на YES (или, что то же самое, Clip Subviews, установленное в Interface Builder). Затем поместите ваш MKMapView внутри этого представления оболочки, с координатой y рамки карты, установленной, например, -80, и высотой набора карт, чтобы его вертикальный центр был выровнен с его родителем.

Затем отобразится компас, но вы не увидите его, потому что он находится над верхней частью его родительского представления - проблема решена.

Ответ 4

Здесь быстрый код:

let mapRotateGesture = UIRotationGestureRecognizer(target: self, action: "didRotateMap:")
mapRotateGesture.delegate = self
self.map.addGestureRecognizer(mapRotateGesture)

func didRotateMap(gesture: UIGestureRecognizer) {
    // Removeing compass
    if (gesture.state == .Began || gesture.state == .Changed) {
        for view in map.subviews as! [UIView] {
            if view.isKindOfClass(NSClassFromString("MKCompassView")) {
                view.removeFromSuperview()
            }
        }
    }
}

Ответ 5

Вы можете скрыть компас на MKMapView во время поворота карты, добавив ниже строку в метод viewDidLoad во всех iOS:

[self.mapView setLayoutMargins:UIEdgeInsetsMake(-50, 0, -50, 0)];

Ответ 6

Вот решение для Swift 4:

mapView.compassView.isHidden = true

Ответ 7

Как я понимаю, вы хотите запретить показывать текущее местоположение пользователя. Вы должны использовать @property (неатомный) BOOL showsUserLocation. Документы об этом

Предположим, что @property (неатомный) MKUserTrackingMode userTrackingMode не может включать или отключать отслеживание, он просто изменяет режим между следующими, следующими и следующими при вращении.