私はこれらの答えのどれにもあまり運がありませんでした. 私自身のピンチを行うことは、あまりにも衝突しました。通常のズームでは、自分のピンチでできるよりもズームインする場合がありました。
もともと、私は元のポスターとして次のようなことを試みました:
- (void) mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
MKCoordinateRegion region = mapView.region;
//...
// adjust the region.center
//...
mapView.region = region;
}
私が見つけたのは、それは効果がないということでした。また、プログラムでorNSLog
を設定した場合でも、このメソッドが起動することを s で発見しました。これにより、「上記が無限に機能する場合、上記はありませんか?」という疑問が生じました。region
centerCoordinate
したがって、ユーザーのズーム/スクロール/回転が発生している間、MapView は何らかの形で領域への変更を抑制または無視するという推測と仮説を立てています。仲裁に関する何かが、プログラムによる調整を無効にします。
それが問題である場合、おそらく重要なのは、regionDidChanged:
通知の外で地域調整を取得することです。また、調整を行うと別の通知がトリガーされるため、いつ調整を中止するかを決定できることが重要です。これにより、次の実装にたどり着きました(ここでsubject
は、中央にとどまりたい中心座標を提供しています):
- (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];
});
}
}
}
}
スライドバックの遅延はさまざまですが、実際にはかなりうまく機能します. そして、それが起こっている間、マップの相互作用を Apple 風のままにします。