菜鸟教程小白 发表于 2022-12-12 18:20:23

ios - 在 MKMapView 上绘制自定义形状(地理围栏)区域


                                            <p><p>我正在创建一个<code>通用应用程序</code>,我必须在<code>map view</code>上创建自定义安全区。</p>

<p>我做的是:</p>

<ol>
<li>添加一个新的 <code>UIView</code> 作为 <code>map view</code> 的父 View ,名为 <code>squareZone</code>。 </li>
<li>在 <code>squareZone</code>View 中,我添加了 <code>UIPanGestureRecognizer</code>、<code>UIPinchGestureRecognizer</code> 和 <code>UIRotationGestureRecognizer</code>,这样我就可以移动、旋转和缩放(进出)。</li>
</ol>

<p>这是 SquareZone 的代码</p>

<pre><code>- (id)initWithFrame:(CGRect)frame{
    self = ;
    if (self) {
      self.opaque = NO;
      self.layer.cornerRadius = 5.0f;
    }
    return self;
}

- (void)drawRect:(CGRect)rect {
    ;

    UIColor *color = ;

    UIBezierPath *rectanglePath = ;
    ;
    ;
    ;
    rectanglePath.lineWidth = 5;
    CGFloat rectanglePattern[] = {2, 3};
    ;
    ;
}
</code></pre>

<p> <a href="/image/DMggh.png" rel="noreferrer noopener nofollow"><img src="/image/DMggh.png" alt="squareZone"/></a> </p>

<p>现在,当用户调整 <code>squareZone</code> 时,我必须在 <code>UILabel</code> 上显示每个点之间的距离(以米为单位)。对于我正在使用的那个任务 </p>

<pre><code>- (CLLocationDistance)distanceFromLocation:(const CLLocation *)location
</code></pre>

<p>当用户与 <code>squareZone</code> 交互时,如何添加/显示四个 <code>UILabels</code>。</p>

<p>我需要一些光。我看过很多教程,但我无法想象这怎么可能。作为引用,有一个应用叫做</p>

<p>Trax:<a href="https://itunes.apple.com/us/app/trax-gps-tracker/id647170688?mt=8" rel="noreferrer noopener nofollow">https://itunes.apple.com/us/app/trax-gps-tracker/id647170688?mt=8</a> </p>

<p>我必须做同样的绘图地理围栏区。</p>

<p>提前致谢。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>首先要提的是<code>Trax</code>有两种不同的模式:</p>

<p>1) <code>editing</code> -- 绘制路径的地方</p>

<p>2) <code>live</code> -- 显示结果的地方。</p>

<h2>编辑模式</h2>

<p>在 <code>editing</code> 中,您不能在 MKMapView 内移动和缩放。发生这种情况是因为他们使用与您相同的方法——他们在 <code>MKMapView</code> 之上添加了一个 <code>UIView</code>,因此手势不会相互冲突。</p>

<p>您需要做的就是将 <code>CGPoint</code>s 添加到某个数组中并在将来使用它们。</p>

<p>当然,使用 <code>CoreGraphics</code> 框架有一些困难,但没那么棘手。</p>

<h2>直播模式</h2>

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

<pre><code>CGPoint thePoint = ...
CLLocationCoordinate2D theLocationCoordinate2D = ;
</code></pre>

<p><code>Trax</code> 在他们的应用中可能(几乎可以肯定)是 <code>MKPolygon</code> 类的实例。</p>

<p>你可以这样添加:</p>

<pre><code>NSUInteger theCount = self.theMainDrawingView.thePointsArray.count;
CLLocationCoordinate2D theLocationCoordinatesArray;
for (NSUInteger theIndex = 0; theIndex &lt; theCount; theIndex++)
{
    CGPoint thePoint = self.theMainDrawingView.thePointsArray.CGPointValue;
    CLLocationCoordinate2D theLocationCoordinate2D = ;
    theLocationCoordinatesArray = theLocationCoordinate2D;
}
MKPolygon *thePolygon = ;
;
</code></pre>

<p>然而,这还不是结束。这将触发您的 <code>MKMapView</code> 的委托(delegate)方法(不要忘记设置其 <code>.delegate</code> 属性)</p>

<pre><code>- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id&lt;MKOverlay&gt;)overlay
{
    if (!])
    {
      return nil;
    }
    MKPolygonView *thePolygonView = [ initWithPolygon:(MKPolygon *)overlay];
    thePolygonView.fillColor = [ colorWithAlphaComponent:0.2];
    thePolygonView.strokeColor = [ colorWithAlphaComponent:0.6];
    thePolygonView.lineWidth = 4;
    return thePolygonView;
}
</code></pre>

<p>结果如下所示:</p>

<p> <a href="https://youtu.be/G0zmCWSlrSE" rel="noreferrer noopener nofollow"><img src="https://j.gifs.com/pYRl9m.gif" alt="Demo CountPages alpha"/></a> </p>

<h2>总结</h2>

<p>当然,这并不能完全解决问题,因为您还必须添加 <code>pinch</code> 和 <code>pan</code> 手势,但我希望我能指出正确的方向。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 在 MKMapView 上绘制自定义形状(地理围栏)区域,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/34931256/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/34931256/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在 MKMapView 上绘制自定义形状(地理围栏)区域