Отключить компас на MKMapView
Я использую MapView в своем приложении, чтобы показать некоторые аннотации. В iOS 7 на карте случайно отображается компас. Я не могу воспроизвести ошибку, потому что она появляется случайным образом, но я хочу ее отключить.
Любые идеи о том, как отключить его?
Обновление: я узнал, что это не случайно, а конкретным жестом. Когда вы используете 2 пальца и сдвиньте один правый, а другой - влево.
Ответы
Ответ 1
Вы можете легко отключить компас на OSX 10.9/iOS 9 и более поздних версиях с помощью свойства showsCompass
:
yourMapView.showsCompass = NO;
На iOS 8 или более ранних версиях ваши варианты:
-
Сосать его и жить с ним.
-
Используйте взломать, например:
-
Если вы не поворачиваете карту программно и она еще не была повернута, полностью отключите вращение, используя
mapView.rotateEnabled = NO;
Компас отображается только при повороте карты, поэтому при этом вы гарантируете, что компас никогда не запускается.
Мне непонятно, почему 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
не может включать или отключать отслеживание, он просто изменяет режим между следующими, следующими и следующими при вращении.