iOS: в MKMapView невозможно переключаться между типами MKMapTypeStandard и MKMapTypeMutedStandard - PullRequest
1 голос
/ 03 апреля 2020

В моем приложении есть MKMapView, и я хочу, чтобы пользователь мог переключать тип карты, чтобы он мог быть MutedStandard, Standard, Satellite или Hybrid. Я подключил UISegmentedControl к контроллеру представления карты, чтобы изменить типы карты. Проблема в том, что, когда я пытаюсь переключаться между MutedStandard и Standard (или наоборот), вид карты никогда не обновляется! Он отлично работает при любом другом изменении типа ... и работает, если я завершаю работу и перезагружаю приложение, но изменение типа карты в реальном времени никогда не срабатывает, если оно просто между MutedStandard и Standard.

Другая странная вещь в том, что он отлично работает на iOS12 ... только не на iOS13.

Вот простой код, который обрабатывает это:

- (IBAction) updateMapTypeSegmentControlValueChanged:(id)sender {
    [[NSUserDefaults standardUserDefaults] setInteger:self.segmentMapType.selectedSegmentIndex forKey:MapViewSettingsDisplayType];
    [self updateMapDisplayType];
}

- (void) updateMapDisplayType {
    NSUInteger mapType = [[NSUserDefaults standardUserDefaults] integerForKey: MapViewSettingsDisplayType];
    switch (mapType) {
        case 0:
        {
            NSLog(@"MapView: updateMapDisplayType - setting to Muted");
            self.mapView.mapType = MKMapTypeMutedStandard;
            break;
        }
        case 1:
        {
            NSLog(@"MapView: updateMapDisplayType - setting to Standard");
            self.mapView.mapType = MKMapTypeStandard;
            break;
        }

        case 2:
        {
            NSLog(@"MapView: updateMapDisplayType - setting to Satellite");
            self.mapView.mapType = MKMapTypeSatellite;
            break;
        }
        case 3:
        {
            NSLog(@"MapView: updateMapDisplayType - setting to Hybrid");
            self.mapView.mapType = MKMapTypeHybrid;
            break;
        }
        default:
        {
            self.mapView.mapType = MKMapTypeMutedStandard;
            break;
        }
    }
}

Любые идеи о том, что я могу попытаться сделать эту работу? Я попытался использовать dispatch_after, чтобы заставить его изменить тип через 1 секунду, но это не сработало. Ни один не звонил [mapView setNeedsDisplay]

1 Ответ

0 голосов
/ 04 апреля 2020

Похоже, вам не нужно выходить, но если вы вообще переместите карту, вы увидите сдвиг от приглушенного к стандартному (или наоборот).

Существует множество вещи, которые вы можете сделать, чтобы вызвать перерисовку. Например, если вы используете физическое устройство и используете userTrackingMode из MKUserTrackingModeFollow (.follow в Swift), вы будете стремиться чтобы увидеть это обновление достаточно быстро. Или я обнаружил, что если я переключу его на спутник и сразу на приглушенный / стандартный, вы увидите это изменение. Или еще проще, просто установите centerCoordinate (даже на его текущее значение), и вы увидите изменение:

- (void) updateMapDisplayType:(int)index {
    switch (index) {
        case 0:
            self.mapView.centerCoordinate = self.mapView.centerCoordinate;
            self.mapView.mapType = MKMapTypeMutedStandard;
            break;

        case 1:
            self.mapView.centerCoordinate = self.mapView.centerCoordinate;
            self.mapView.mapType = MKMapTypeStandard;
            break;

        case 2:
            self.mapView.mapType = MKMapTypeSatellite;
            break;

        case 3:
            self.mapView.mapType = MKMapTypeHybrid;
            break;

        default:
            self.mapView.centerCoordinate = self.mapView.centerCoordinate;
            self.mapView.mapType = MKMapTypeMutedStandard;
            break;
    }
}

enter image description here

Это, очевидно, просто помеха, чтобы обойти то, что кажется ошибкой. Я отправлю отчет об ошибке.

...