菜鸟教程小白 发表于 2022-12-12 21:13:32

ios - viewforoverlay 永远不会被调用


                                            <p><p>这让我发疯了。我已经浏览了 stackoveflow 上的所有帖子,但没有任何内容符合要求。我正在尝试添加一个简单的折线(即不是自定义叠加)作为我的 <code>MKMapView</code> 的叠加。委托(delegate)上的 <code>viewForOverlay</code> 方法永远不会被调用。 map 委托(delegate)被正确地为所有其他委托(delegate)函数调用。以下是 <code>viewForOverlay</code> 方法的代码:</p>

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

    NSLog(@&#34;does it ask for the overlay view?&#34;);

    MKOverlayView *overlayView = nil;

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

<p>这是我构造折线并将其添加到 map 的代码:</p>

<pre><code>    MKPolyline *thePolyline = ];

    ;

    ;
</code></pre>

<p>实际上,折线确实有我的点集合(大约 1000 个),所以我认为问题不存在。我是否缺少 mapView 上的某些必需属性或其他一些实现?</p>

<p><strong>EDIT</strong> 显示折线 <code>MKMapPoint</code> 生成的代码:</p>

<p>我使用一个包含大约 1100 个点的 xml 文件来生成折线,作为 appConfig 过程的一部分。我分别使用 <code>NSXMLParser</code> 和 <code>NSXMLParserDelegate</code> 读取和解析文件。下面是生成点的代码(来自 <code>NSXMLParserDelegate</code> 协议(protocol)中的 <code>foundCharacters</code> 方法):</p>

<pre><code>//NSXMLParserDelegate methods...
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{

    if(POINT){
      NSArray *arr = ;

      MKMapPoint pt = MKMapPointMake([doubleValue], [doubleValue]);

      MapPointObject *thePoint = [ init];
      thePoint.mapPoint = pt;

      //gives the mkmappoint to the array of points.
      ;

      ;
    }
}
</code></pre>

<p>这里是点实际生成 <code>MKPolyline</code> 并将其提供给 mapView 的位置
(来自 <code>NSXMLParserDelegate</code> 协议(protocol)上的 <code>didEndElement</code> 方法):</p>

<pre><code>   if(){
      MKMapPoint *pts = malloc( * sizeof(MKMapPoint));

      for(int i = 0; i &lt;= - 1; i++){
            MapPointObject *pointObject = ;
            pts = pointObject.mapPoint;
      }

      MKPolyline *thePolyline = ];
      ;

      //adding the polyline to the model&#39;s mapview
      Model *theModel = ;

      ;
      ;

      free(pts);
    }
</code></pre>

<p><code>MKPolyline</code> 上的点数属性实际上表示其中有 1100 个点。 </p>

<p><strong>编辑:</strong>示例 XML 值:</p>

<pre><code>&lt;appConfig&gt;
&lt;point&gt;-94.847587,38.977967&lt;/point&gt;
&lt;point&gt;-94.844111,38.977978&lt;/point&gt;
&lt;point&gt;-94.844108,38.977369&lt;/point&gt;
&lt;point&gt;-94.844003,38.977369&lt;/point&gt;
&lt;point&gt;-94.843955,38.974886&lt;/point&gt;
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>xml 文件包含坐标(纬度和经度)值。这些坐标值与 <code>MKMapPoint</code> 值( mapView 的纬度/经度在平面 map 上的 x,y 投影)不同。</p>

<p>你应该存储坐标而不是 <code>MKMapPoint</code> 值(你是)。</p>

<p>所以不要使用 <code>MKMapPoint</code> 和 <code>polylineWithPoints</code>,而是使用 <code>CLLocationCoordinate2D</code> 和 <code>polylineWithCoordinates</code>。</p>

<p>在xml解析器方法中,使用<code>CLLocationCoordinate2DMake</code>创建并存储一个<code>CLLocationCoordinate2D</code>。</p>

<p><code>pts</code> 数组的类型应该是 <code>CLLocationCoordinate2D *</code> 并且在执行 <code>malloc</code> 时,使用 <code>sizeof(CLLocationCoordinate2D)</code>.</p>

<p>然后调用 <code>polylineWithCoordinates</code> 而不是 <code>polylineWithPoints</code>。</p>

<p><br/>
顺便说一句,在进行上述更改后,您还需要在 <code>viewForOverlay</code> 中实际返回一个非零覆盖 View ,否则您仍然看不到该行:</p>

<pre><code>MKPolylineView *polylineView = [[ initWithPolyline:overlay] autorelease];
polylineView.strokeColor = ;
polylineView.lineWidth = 2.0;
return polylineView;
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - viewforoverlay 永远不会被调用,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/10823257/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/10823257/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - viewforoverlay 永远不会被调用