Nie miałem dużo szczęścia z żadną z tych odpowiedzi. Robienie własnego uszczypnięcia zbytnio kolidowało. Występowałem w przypadkach, w których normalny zoom byłby większy niż w moim własnym szczypcie.
Początkowo próbowałem jak oryginalny plakat zrobić coś takiego:
- (void) mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
MKCoordinateRegion region = mapView.region;
//...
// adjust the region.center
//...
mapView.region = region;
}
co znalazłem było to, że nie miał wpływu. Odkryłem również, że ta metoda będzie uruchamiana, nawet jeśli ustawię programowo region
lub centerCoordinate
. Które doprowadziło do pytania: "Czy powyższe, gdyby to NIE DZIAŁAŁA, byłoby nieskończone?"
Więc jestem conjecturing i hipotez teraz, gdy zoom user/Scroll/obracać się dzieje, MapView jakoś hamuje lub ignoruje zmiany w tym regionie. Coś o arbitrażu renderuje programową regulację bezsilny.
Jeśli to problem, to może kluczem jest uzyskanie dostosowania regionu poza powiadomieniem regionDidChanged:
. A ponieważ każda korekta wyzwala kolejne powiadomienie, ważne jest, aby był w stanie określić, kiedy nie należy już regulować. To doprowadziło mnie do następującej implementacji (gdzie subject
podaje środkową współrzędną, którą chcę pozostawić w środku):
- (void) recenterMap {
double latDiff = self.subject.coordinate.latitude self.mapView.centerCoordinate.latitude;
double lonDiff = self.subject.coordinate.longitude - self.mapView.centerCoordinate.longitude;
BOOL latIsDiff = ABS(latDiff) > 0.00001;
BOOL lonIsDiff = ABS(lonDiff) > 0.00001;
if (self.subject.isLocated && (lonIsDiff || latIsDiff)) {
[self.mapView setCenterCoordinate: self.subject.coordinate animated: YES];
}
}
- (void) mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
if (self.isShowingMap) {
if (self.isInEdit) {
self.setLocationButton.hidden = NO;
self.mapEditPrompt.hidden = YES;
}
else {
if (self.subject.isLocated) { // dispatch outside so it will happen after the map view user events are done
dispatch_after(DISPATCH_TIME_NOW, dispatch_get_main_queue(), ^{
[self recenterMap];
});
}
}
}
}
Opóźnienie w przesunięciu może się różnić, ale naprawdę działa całkiem dobrze. I pozwala interakcji mapy pozostać Apple-esque, podczas gdy to się dzieje.
Musiałem to zrobić wcześniej, ale zrobiłem to inaczej. Wyłączyłem interakcję z MKMapView i dodałem rozpoznawanie gestów szczypcami do widoku powyżej. Następnie przekonwertowałem gesty szczypania na odpowiadający im poziom powiększenia. Tak samo funkcjonalnie dostosowujesz swoje własne szczypanie do powiększenia. Widząc, że to nie odpowiada bezpośrednio na twoje pytanie, jeśli jest to opłacalna opcja, opublikuję w odpowiedziach kod. – random