我對這些答案都沒有太多的運氣。做我自己的捏只是衝突太多。我遇到的情況是,普通的縮放比我自己捏的時候縮小得更遠。
本來,我想爲樓主做這樣的事情:
- (void) mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
MKCoordinateRegion region = mapView.region;
//...
// adjust the region.center
//...
mapView.region = region;
}
我發現他就是那個沒有任何影響。我還通過NSLog
發現,即使我以編程方式設置region
或centerCoordinate
,該方法也會啓動。這導致了這樣一個問題:「如果DID工作無法完成,上面不會有這樣的問題嗎?「
所以我揣測和假設到現在,雖然用戶縮放/滾動/旋轉正在發生的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式。
我收到這樣做,但沒有處理它的方式不同。我禁用了與MKMapView的交互,並在其上方添加了捏手勢識別器。然後,我將捏合手勢轉換爲相應的縮放級別。所以幾乎在功能上自己捏合縮放。由於這不能直接回答你的問題,如果這對你來說是一個可行的選擇,我會在代碼中回答問題。 – random 2012-08-14 05:38:06