菜鸟教程小白 发表于 2022-12-12 10:55:14

iphone - ios中的手绘折线叠加


                                            <p><p>我正在尝试使用叠加层(<code>MKOverlay</code>)在 <code>MKMapView</code> 上徒手追踪路线。</p>

<p>每次我们移动手指时,我都会用新坐标扩展最后一个坐标的折线,除了扩展折线覆盖时,整个覆盖都在设备中闪烁(仅有时),所以我无法追踪问题.</p>

<p>我尝试过的代码如下。</p>

<pre><code>- (void)viewDidLoad

{

    j=0;   
    coords1 = malloc(2* sizeof(CLLocationCoordinate2D));

    coordinatearray=[init];

    UIPanGestureRecognizer *GestureRecogonized = [   initWithTarget:self action:@selector(gestureDetacted:)];

    ;

}

- (void)gestureDetacted:(UIPanGestureRecognizer *)recognizer
{

    if(UIGestureRecognizerStateBegan==recognizer.state)
    {

      CGPoint point = ;   
      CLLocationCoordinate2D tapPoint = ;

      CLLocation *curLocation = [ initWithLatitude:tapPoint.latitude longitude:tapPoint.longitude];

      ;
    }

    coords1=[ coordinate];

    if(UIGestureRecognizerStateChanged==recognizer.state)
    {
         j++;

         CGPoint point = ;
         CLLocationCoordinate2D tapPoint = ;

      CLLocation *curLocation = [ initWithLatitude:tapPoint.latitude longitude:tapPoint.longitude];

      ;
      coords1=CLLocationCoordinate2DMake(tapPoint.latitude,tapPoint.longitude);

      polyLine = ;

      ;
    }
}
</code></pre>

<p>在覆盖委托(delegate)中</p>

<pre><code>- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id &lt;MKOverlay&gt;)overlay {

    if(]){

      MKPolylineView *polylineView = [ initWithPolyline:overlay];

      polylineView.strokeColor = ;
      polylineView.lineWidth = 20;

      polylineView.fillColor=[ colorWithAlphaComponent:.1];

         return polylineView;
    }
}
</code></pre>

<p>谁能知道为什么会出现这种闪烁或闪烁效果以及如何消除它。</p>

<p>提前致谢。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>与其添加数百个非常小的 View (这确实是计算密集型的),我宁愿删除折线叠加层并在平移识别器的每次更改时添加一个包含 map 上所有点的新 View (对于更平滑的效果,可以先添加新的,然后删除旧的)。使用您的 coordinateArray 创建包含所有点的 MKPolyline 叠加层,而不是最后两个点。
你可以这样做:</p>

<pre><code>;;
CLLocationCoordinate2D* coordArray = malloc(sizeof(CLLocationCoordinate2D)*);
memcpy(coordArray, self.coordinates, sizeof(CLLocationCoordinate2D)*(-1));   
coordArray[-1] = curLocation;
free(self.coordinates);
self.coordinates = coordArray;
MKPolyline *polyline = ];
MKPolyline *old = [ lastObject];
;
;
</code></pre>

<p>其中 self.coordinate 是 CLLocationCoordinate2D* 类型的属性,这样你就可以将现有的数组 memcpy 到一个新的数组中(memcpy 真的很有效)并且只需要将最后一个点添加到数组中,而不必循环通过 <code>NSArray *coordinatearray</code> 的每个点。</p>

<p>您还必须更改您的 <code>if(UIGestureRecognizerStateBegan==recognizer.state)</code> 部分,以在 self.coordinates 中添加第一个点击点。
就像这样:</p>

<pre><code>self.coordinates = malloc(sizeof(CLLocationCoordinate2D));
self.coordinates = curLocation;
</code></pre>

<p>编辑:我认为问题在于 map 叠加层为缩放级别的不同离散值绘制自己。在某个缩放级别上,似乎覆盖首先以较大的缩放级别绘制自身,然后以较小的缩放级别绘制(实际上是在先前绘制的覆盖上绘制)。当您尝试在此缩放级别显示诸如绘制用户平移手势的动画时,这就是叠加层不断闪烁的原因。一种可能的解决方案是使用放置在 mapView 顶部的透明 View ,在用户不断移动手指的同时执行绘图。只有在平移手势结束后,您才会创建一个 map 叠加层,将其“固定”到 map 上并清理绘图 View 。重绘 View 时还需要小心,因为每次都应仅指定要重绘的矩形,然后仅在该矩形中重绘,因为每次重绘整个事物也会导致该 View 闪烁。这肯定涉及更多的编码,但它应该可以工作。检查此<a href="https://stackoverflow.com/questions/1798414/drawing-incrementally-in-a-uiview-iphone" rel="noreferrer noopener nofollow">question</a>了解如何在 View 上逐步绘制。</p></p>
                                   
                                                <p style="font-size: 20px;">关于iphone - ios中的手绘折线叠加,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/16476824/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/16476824/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: iphone - ios中的手绘折线叠加