ios - 如何将MKCircleView从一个位置移动到MKMapView中的另一个位置?

标签 ios objective-c touch mkmapview uitapgesturerecognizer

我使用 MkCircle 声明位置现在我必须将 MKMapView 中的圆位置从一个位置更改为另一个位置(拖放)。我怎样才能做到这一点。任何帮助将不胜感激。

最佳答案

首先,我建议您使用一些类属性来跟踪叠加层:

@property (nonatomic, weak) MKCircle *overlay;

然后,定义一个 UIPanGestureRecognizer 来执行拖放操作:

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

要使手势可取消,您应该导入以下 header :

#import <UIKit/UIGestureRecognizerSubclass.h>

您需要为此手势识别器编写一个处理程序,为您拖动的位置添加覆盖层并删除旧的覆盖层(但如果手势不是从覆盖层开始,则取消该手势):

- (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;
    }
}

请注意,必须关闭 map 的 scrollEnabled 才能识别此手势。

关于ios - 如何将MKCircleView从一个位置移动到MKMapView中的另一个位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18404663/

相关文章:

iphone - 缩短 UIScrollView 中的触摸延迟?

JavaScript 拖放不适用于 iPad

javascript - 通过添加/删除事件监听器来打开/关闭文档触摸移动

ios - 在钥匙串(keychain)中存储用于加密密码的 key 的最佳位置在哪里?

iphone - 使用 coredata 准备应用发布

objective-c - 我的应用程序在 CGRectIntersectsRect 上崩溃

ios - 将两个 UIImage 并排保存为一个组合图像?

iOS : Radio Button Programatically Without using any Image

适用于 iOS 的 JavaScript 日期正则表达式

ios - Braintree Drop in UI-添加信用卡