Если ущипнуть, чтобы увеличить / уменьшить масштаб в приложении «Карты» Apple во время отслеживания местоположения устройства, компонент «панорамирование» в жесте сжатия игнорируется, и синий индикатор местоположения остается неподвижным в центре экрана. Это не тот случай, когда используется простой 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]];