2011-05-15 87 views
10

如果捏在蘋果的地圖應用程序中放大/縮小,跟蹤設備的位置,捏手勢的「平移」組件將被忽略,藍色位置指示器保持固定在屏幕。當使用普通的MKMapView時,情況並非如此。保持中心座標,同時捏MKMapView

假設我已經有用戶的位置,我怎麼能達到這個效果?我嘗試重置代表的regionDid/WillChangeAnimated:方法中的中心座標,但它們只在手勢的開始和結束處被調用。我還嘗試添加一個UIPinchGestureRecognizer子類,當觸摸移動時重置中心座標,但這導致呈現毛刺。


編輯:對於那些有興趣誰,對我下面的作品。

// CenterGestureRecognizer.h 
@interface CenterGestureRecognizer : UIPinchGestureRecognizer 

- (id)initWithMapView:(MKMapView *)mapView; 

@end 

// CenterGestureRecognizer.m 
@interface CenterGestureRecognizer() 

- (void)handlePinchGesture; 

@property (nonatomic, assign) MKMapView *mapView; 

@end 

@implementation CenterGestureRecognizer 

- (id)initWithMapView:(MKMapView *)mapView { 
    if (mapView == nil) { 
    [NSException raise:NSInvalidArgumentException format:@"mapView cannot be nil."]; 
    } 

    if ((self = [super initWithTarget:self action:@selector(handlePinchGesture)])) { 
    self.mapView = mapView; 
    } 

    return self; 
} 

- (BOOL)canBePreventedByGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer { 
    return NO; 
} 

- (BOOL)canPreventGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer { 
    return NO; 
} 

- (void)handlePinchGesture { 
    CLLocation *location = self.mapView.userLocation.location; 
    if (location != nil) { 
    [self.mapView setCenterCoordinate:location.coordinate]; 
    } 
} 

@synthesize mapView; 

@end 

然後簡單地把它添加到您的MKMapView

[self.mapView addGestureRecognizer:[[[CenterGestureRecognizer alloc] initWithMapView:self.mapView] autorelease]]; 

回答

5

當用戶捏住實際設備上的屏幕(與模擬器相反)時,它會導致平移捏合手勢 - 捏合包含運動的「縮放」元素,而平移包含垂直和水平的變化。你需要攔截和阻止鍋,這意味着使用UIPanGestureRecognizer

scrollEnabled設置爲NO,然後添加UIPanGestureRecognizer以重置中心座標。該組合將阻止雙指平移和掐指的平底鍋組件。


編輯添加更多細節,並看到你的代碼之後:touchesMoved:withEvent被泛稱爲後已經開始,因此,如果您更改的MKMapView的中心在那裏,你會得到herky生澀渲染問題你已經描述過了。你真正需要的是創建一個目標 - 動作一個UIPanGestureRecognizer,像這樣:

UIPanGestureRecognizer *pan = [[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(didRecognizePan)] autorelease]; 
    pan.delegate = self; 
    [self.mapView addGestureRecognizer:pan]; 

...然後添加一個didRecognizePan方法來你的控制器,做您的中心復位那裏。

+0

這導致了與上面提到的相同的渲染問題:地圖視圖的中心在用戶的位置和手勢識別器運行其路線的位置之間頻繁交替。 也許我誤解了你的答案?我已經在這裏發佈了我的'UIPanGestureRecognizer'子類的實現:http://pastie.org/1934011 – 2011-05-20 23:35:54

+0

這就實現了!我很高興解決方案非常簡單。謝謝,斯科特。 – 2011-05-21 01:59:53

0

只是一個猜測,但你嘗試過在regionWillChangeAnimated:開始設置scrollEnabledNO

+0

不幸的是,沒有奏效。如果我在開始時(代表方法之外)將其設置爲「NO」,則單指平移將被禁用,但捏手勢的「平移」組件仍被使用。 – 2011-05-17 21:52:25

0

只是猜測。在regionWillChangeAnimated的開始處:保存當前地圖區域,然後使用self.myMapView.region = theSavedRegion或類似方法通過NSTimer持續更新區域。然後在調用regionDidChangeAnimated:時使計時器無效。

但是,您可能會遇到由NSTimer更新區域會導致再次調用regionWillChangeAnimated的問題。

試試看看會發生什麼。

+0

我懷疑這會導致與問題中提到的相同的渲染故障;它只是用一個定時器而不是'UIGestureRecognizer'來做同樣的事情。如果我取得任何成功,我會調查並報告。 – 2011-05-20 11:57:15

+0

我嘗試攔截平底手勢時玩了一下,但似乎並不奏效。祝你好運,迫不及待想聽聽解決方案是什麼! – timthetoolman 2011-05-20 18:50:31