我有以下問題:iOS - 如何限制MapView到特定區域?
我有一個「繪製的地圖」(圖片),我將它添加到MapView作爲覆蓋。沒有問題,但..我需要將地圖視圖限制到疊加區域,所以用戶無法在此區域之外滾動/縮放......但應該可以在「邊界」內滾動/縮放「的覆蓋 - 意味着我不能禁用縮放/滾動的MapView。
有沒有關於這個主題的任何想法/解決方案?使用MapView/-Kit的原因是我需要將各種POI添加到自定義地圖。當使用ImageView + ScrollView呈現自定義地圖時,這可能會變得更加複雜。
我已經研究了很多關於這個話題,但我沒有找到一個很好的解決方案。
任何幫助表示讚賞!
最好的問候, 基督教
編輯:這是我們的解決方案: 您提供的左上和bottomright協調,以限制地圖。 (最小)縮放級別也是有限的。我已經停用了減速功能,並且您可以從地圖中反彈一下(以獲得更好的性能/ ux)。我在疊加層上添加了1公里左右的灰色邊框,因此用戶無法看到谷歌的原始世界地圖。
LimitedMapView.h:
#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>
@interface LimitedMapView : MKMapView <UIScrollViewDelegate>{
}
@property (nonatomic, assign) CLLocationCoordinate2D topLeftCoordinate;
@property (nonatomic, assign) CLLocationCoordinate2D bottomRightCoordinate;
@end
LimitedMapView.m:
#import "LimitedMapView.h"
@implementation LimitedMapView
@synthesize topLeftCoordinate, bottomRightCoordinate;
- (void)scrollViewDidZoom:(UIScrollView *)scrollView{
if([super respondsToSelector:@selector(scrollViewDidZoom:)]) [super scrollViewDidZoom:scrollView];
if ([self region].span.latitudeDelta > 0.002401f || [self region].span.longitudeDelta > 0.003433f) {
CLLocationCoordinate2D center = self.centerCoordinate;
MKCoordinateSpan span = MKCoordinateSpanMake(0.002401f, 0.003433f);
self.region = MKCoordinateRegionMake(center, span);
}
}
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
if([super respondsToSelector:@selector(scrollViewDidEndDragging:)]) [super scrollViewDidEndDragging:scrollView willDecelerate:decelerate];
MKCoordinateRegion currentRegion = self.region;
bool changeRegionLong = YES;
bool changeRegionLat = YES;
// LONGITUDE
if((currentRegion.center.longitude - (currentRegion.span.longitudeDelta/2)) < self.topLeftCoordinate.longitude) {
currentRegion.center.longitude = (topLeftCoordinate.longitude + (currentRegion.span.longitudeDelta/2));
} else if((currentRegion.center.longitude + (currentRegion.span.longitudeDelta/2)) > self.bottomRightCoordinate.longitude) {
currentRegion.center.longitude = (bottomRightCoordinate.longitude - (currentRegion.span.longitudeDelta/2));
} else {
changeRegionLong = NO;
}
// LATITUDE
if((currentRegion.center.latitude + (currentRegion.span.latitudeDelta/2)) > self.topLeftCoordinate.latitude) {
currentRegion.center.latitude = (topLeftCoordinate.latitude - (currentRegion.span.latitudeDelta/2));
} else if((currentRegion.center.latitude - (currentRegion.span.latitudeDelta/2)) < self.bottomRightCoordinate.latitude) {
currentRegion.center.latitude = (bottomRightCoordinate.latitude + (currentRegion.span.latitudeDelta/2));
} else {
changeRegionLat = NO;
}
if(changeRegionLong || changeRegionLat) [self setRegion:currentRegion animated:YES];
}
-(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{
[scrollView setContentOffset:scrollView.contentOffset animated:YES];
}
@end
加入我的解決方案。 – cweinberger 2011-04-22 12:59:12
感謝您使用解決方案進行更新。我只是想限制最大縮放,並且使用scrollViewDidZoom時遇到了一些問題:對於其他任何人,確保將新跨度設置爲小於if檢查跨度,否則mapview將卡住在max放大。 – Andrew 2011-06-17 15:38:15
爲swift提供了一個更好的書面解決方案http://stackoverflow.com/a/31799617/2814964 – cl3m 2015-09-23 14:15:50