2013-08-23 1 views

ответ

2

Во-первых, я хотел бы предложить вам иметь некоторый класс свойство для отслеживания наложения:

@property (nonatomic, weak) MKCircle *overlay; 

Затем определяют UIPanGestureRecognizer выполнить перетаскивание:

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

Для того, чтобы этот жест будет отменен, вы должны импортировать следующий заголовок:

#import <UIKit/UIGestureRecognizerSubclass.h> 

И вам нужно t о написать обработчик для этого жеста распознаватель, который добавляет накладку для того, где вы вытащили и удаляет старую (но отменяет этот жест, если не начать накладку):

- (void)handlePan:(UIPanGestureRecognizer *)gesture 
{ 
    static CGPoint originalPoint; 

    if (gesture.state == UIGestureRecognizerStateBegan) { 
     CGPoint point = [gesture locationInView:gesture.view]; 
     CLLocationCoordinate2D tapCoordinate = [self.mapView convertPoint:point toCoordinateFromView:gesture.view]; 
     CLLocation *tapLocation = [[CLLocation alloc] initWithLatitude:tapCoordinate.latitude longitude:tapCoordinate.longitude]; 

     CLLocationCoordinate2D originalCoordinate = [self.overlay coordinate]; 
     CLLocation *originalLocation = [[CLLocation alloc] initWithLatitude:originalCoordinate.latitude longitude:originalCoordinate.longitude]; 

     if ([tapLocation distanceFromLocation:originalLocation] > [self.overlay radius]) { 
      gesture.state = UIGestureRecognizerStateCancelled; 
      return; 
     } 
     else 
      originalPoint = [self.mapView convertCoordinate:originalCoordinate toPointToView:gesture.view]; 
    } 

    if (gesture.state == UIGestureRecognizerStateChanged) { 
     CGPoint translation = [gesture translationInView:gesture.view]; 
     CGPoint newPoint = CGPointMake(originalPoint.x + translation.x, originalPoint.y + translation.y); 

     CLLocationCoordinate2D newCoordinate = [self.mapView convertPoint:newPoint toCoordinateFromView:gesture.view]; 

     MKCircle *circle = [MKCircle circleWithCenterCoordinate:newCoordinate radius:[self.overlay radius]]; 
     [self.mapView addOverlay:circle]; 
     [self.mapView removeOverlay:self.overlay]; 
     self.overlay = circle; 
    } 
} 

Отметим, что МАП scrollEnabled имеет для того, чтобы этот признак был распознан.