我正在创建Universal app,并且必须在map view上创建自定义安全区域。

我要做的是:

  • 添加新的UIView作为map view的 super 视图,称为squareZone
  • squareZone视图中,我添加了UIPanGestureRecognizerUIPinchGestureRecognizerUIRotationGestureRecognizer,以便可以移动,旋转和缩放(放大和缩小)。

  • 这是SquareZone的代码
    - (id)initWithFrame:(CGRect)frame{
        self = [super initWithFrame:frame];
        if (self) {
            self.opaque = NO;
            self.layer.cornerRadius = 5.0f;
        }
        return self;
    }
    
    - (void)drawRect:(CGRect)rect {
        [super drawRect:rect];
    
        UIColor *color = [UIColor colorWithRed: 0.765 green: 0.439 blue: 0.443 alpha: 0.658];
    
        UIBezierPath *rectanglePath = [UIBezierPath bezierPathWithRect: rect];
        [color setFill];
        [rectanglePath fill];
        [UIColor.whiteColor setStroke];
        rectanglePath.lineWidth = 5;
        CGFloat rectanglePattern[] = {2, 3};
        [rectanglePath setLineDash: rectanglePattern count: 2 phase: 0];
        [rectanglePath stroke];
    }
    

    ios - 在MKMapView上绘制自定义形状(Geofences)区域-LMLPHP

    现在,当用户调整squareZone时,我必须在UILabel上显示以米为单位的每个点之间的距离。为此,我正在使用
    - (CLLocationDistance)distanceFromLocation:(const CLLocation *)location
    

    当用户与UILabels交互时,如何添加/显示四个squareZone

    我这里需要些灯。我看过很多教程,但我无法想象这怎么可能。作为参考,有一个名为

    Trax:https://itunes.apple.com/us/app/trax-gps-tracker/id647170688?mt=8

    我必须执行相同的“绘图地理围栏”区域。

    提前致谢。

    最佳答案

    首先要提到的是Trax具有两种不同的模式:

    1)editing-绘制路径

    2)live-显示结果的位置。

    编辑模式

    使用editing时,无法在MKMapView内部移动和缩放。发生这种情况的原因是,他们使用的方法与您使用的方法相同-他们在UIView的顶部添加了MKMapView,以使手势不会相互冲突。

    您需要做的就是将CGPoint添加到某个数组中,并在将来使用它们。

    当然,使用CoreGraphics框架有一些困难,但这并不是那么棘手。

    现场模式

    用户添加了所有CGPoint之后,您现在必须将这些点转换为实际的CLLocationCoordinate2D实例。

    CGPoint thePoint = ...
    CLLocationCoordinate2D theLocationCoordinate2D = [theMapView convertPoint:thePoint toCoordinateFromView:theDrawingView];
    

    他们的应用程序中的Trax可能(几乎可以肯定)是MKPolygon类的实例。

    您可以这样添加它:
    NSUInteger theCount = self.theMainDrawingView.thePointsArray.count;
    CLLocationCoordinate2D theLocationCoordinatesArray[theCount];
    for (NSUInteger theIndex = 0; theIndex < theCount; theIndex++)
    {
        CGPoint thePoint = self.theMainDrawingView.thePointsArray[theIndex].CGPointValue;
        CLLocationCoordinate2D theLocationCoordinate2D = [self.theMainMapView convertPoint:thePoint toCoordinateFromView:self.theMainDrawingView];
        theLocationCoordinatesArray[theIndex] = theLocationCoordinate2D;
    }
    MKPolygon *thePolygon = [MKPolygon polygonWithCoordinates:theLocationCoordinatesArray count:theCount];
    [self.theMainMapView addOverlay:thePolygon];
    

    但是,这还没有结束。这将触发MKMapView的委托方法(不要忘记设置其.delegate属性)
    - (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay
    {
        if (![overlay isKindOfClass:[MKPolygon class]])
        {
            return nil;
        }
        MKPolygonView *thePolygonView = [[MKPolygonView alloc] initWithPolygon:(MKPolygon *)overlay];
        thePolygonView.fillColor = [[UIColor cyanColor] colorWithAlphaComponent:0.2];
        thePolygonView.strokeColor = [[UIColor redColor] colorWithAlphaComponent:0.6];
        thePolygonView.lineWidth = 4;
        return thePolygonView;
    }
    

    结果如下:

    ios - 在MKMapView上绘制自定义形状(Geofences)区域-LMLPHP

    摘要

    当然,这不能完全解决问题,因为您也必须添加pinchpan手势,但是我希望我能指出正确的方向。

    10-05 20:26