菜鸟教程小白 发表于 2022-12-12 22:16:58

ios - 点按即可从 pin 的注释披露中获取坐标


                                            <p><p>我会尽量保持简单:</p>

<p>我对 Objective-C(或者实际上是编程)非常陌生,所以我可能需要的不仅仅是答案。</p>

<p><strong>我正在尝试做和不能做的事情(还):</strong>
在点击它的公开后获取一个图钉的坐标,并最终通过一个segue。
实际上,我正在单击我刚刚创建的图钉上的“信息”图标,我想在另一个页面( WebView )中查看它的信息。此页面将显示坐标(以及我们在这里不需要的其他内容)。</p>

<p><strong>为什么:</strong>
实际上,我在用户之前创建的图钉注释上单击“信息”图标,我想在另一个页面( WebView )中查看它的信息。此页面将显示坐标(以及我们在这里不需要的其他内容)。</p>

<p>我的别针坐标存储在一个</p>

<blockquote>
<p>CLLocationCoordinate2D location;</p>
</blockquote>

<p>我不能重复使用我之前使用的变量,因为它们可能已经过时(只有当用户要求创建最后一个变量时才会起作用......)
而且我不知道如何获得图钉的坐标;必须有一种方法或其他东西,但我找不到它。我在互联网上找到了很多答案,但似乎没有一个有效,可能是因为我没有正确理解它们。无论如何,我无法使用它们。</p>

<p>我会向你展示我的一些代码,我想这很简单:</p>

<p><strong>有 viewDidLoad</strong>,我猜你可能想看看:</p>

<pre><code>- (void)viewDidLoad
{
    ;
    name = [init];
    detail = [init];
    UILongPressGestureRecognizer *lpgr = [ initWithTarget:self action:@selector(longpressToGetLocation:)];
    lpgr.minimumPressDuration = 2.0;//user must press for 2 seconds
    ;
    CLLocationCoordinate2D loc = CLLocationCoordinate2DMake(50.837863, 4.353616);
    MKCoordinateSpan span = MKCoordinateSpanMake(.035, .035);
    MKCoordinateRegion reg = MKCoordinateRegionMake(loc, span);
    self.map.region = reg;
    ;
    self.map.showsUserLocation = true;
}
</code></pre>

<p>我知道这很重要,但老实说,我并不完全理解这一点是如何工作的;不过,它确实有效。 :D</p>

<pre><code>    -(MKAnnotationView*)mapView:(MKMapView*)mapView viewForAnnotation:(id &lt;MKAnnotation&gt;)annotation
{
    MKAnnotationView* v = nil;
    {
      static NSString* ident = @&#34;Pin&#34;;
      v = ;
      if (v == nil)
      {
            v = [ initWithAnnotation:annotation reuseIdentifier:ident];
            ((MKPinAnnotationView*)v).pinColor = MKPinAnnotationColorRed;
            UIButton *infoButton = ;
            v.rightCalloutAccessoryView = infoButton;
            v.centerOffset= CGPointMake(0,-20);
            v.canShowCallout= YES;
      }
      v.annotation = annotation;
    }
    return v;
}
</code></pre>

<p><strong>触摸图钉创建:</strong></p>

<pre><code>- (void)longpressToGetLocation:(UIGestureRecognizer *)gestureRecognizer
{
    if (gestureRecognizer.state != UIGestureRecognizerStateBegan)
      return;

    CGPoint touchPoint = ;
    location = ;

    ;
}
</code></pre>

<p><strong>实际的注解/图钉创建方法</strong> </p>

<pre><code>-(void)buildAnno
{
    CLLocationCoordinate2D coordinate;
    coordinate.latitude = location.latitude;
    coordinate.longitude = location.longitude;
    MKPointAnnotation* newann = ;
    newann.coordinate = coordinate;

    newann.title = name;
    newann.subtitle = detail;
    ;
}
</code></pre>

<p>请告诉您是否需要更多代码;我不太确定我能给你什么,因为我的代码可能是“正确的”(或体面的),我只需要真正知道如何获取我需要的信息(即,坐标和来 self 的 pin 的其他内容)刚刚点击。)</p>

<p>我实际上并没有点击图钉,我点击图钉注释中的披露。无论如何,现在就够了!</p>

<p>一旦我能捕捉到这些坐标,我相信我将能够通过 segue 传递它们,因为传递数据已经在这里得到很好的解释,但如果有什么“特别”,如果你能,我会很高兴将其添加到您的解释中,因为我仍然对所有这些感到非常不舒服,而且我发现的大多数教程/指南/链接并没有真正帮助我。</p>

<p>非常感谢您的时间和帮助:)</p>

<p>(编辑:我发现了一个类似的问题 <a href="https://stackoverflow.com/questions/18380065/how-to-get-coordinate-data-of-selected-map-pin" rel="noreferrer noopener nofollow">here</a> 但我相信我需要额外的帮助/解释。)</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>您不需要手势识别器 -mapView 委托(delegate)协议(protocol)已经有一个方法可以告诉您何时点击标注附件 <code>calloutAccessoryControlTapped</code> 并且此方法接收相关的 <code>annotationView</code>。 <code>annotationView.annotation</code> 属性让您回到相关的注释对象,然后您可以访问它的 <code>coordinate</code> 属性来获取图钉的坐标。 </p>

<p>首先,在你的类中创建一个新属性:</p>

<pre><code> @property CLLocationCoordinate2D tappedCoord;
</code></pre>

<p>然后实现委托(delegate)方法</p>

<pre><code>- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
    MKPointAnnotation *annotation=(MKPointAnnotation*)view.annotation;
    self.tappedcoord=annotation.coordinate;
    ;   // Use your appropriate segue identifier
}
</code></pre>

<p>然后你可以访问 <code>prepareForSegue</code> 中的属性(同样,更改为适当的 segue 名称和目标 ViewController 类)</p>

<pre><code>-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if (){
      DetailViewController *dvc=(DetailViewController *)segue.destinationViewController;
      dvc.coord=self.tappedCoord;
}
</code></pre>

<p>此外,由于您的 MapView 正在显示用户的位置,因此会有一个注释。您需要在 <code>viewForAnnotation</code> 方法中解决此问题,如果注释不是您的注释,则返回 nil。您可以检查注释的类以确定这一点 - </p>

<pre><code>-(MKAnnotationView*)mapView:(MKMapView*)mapView viewForAnnotation:(id &lt;MKAnnotation&gt;)annotation
{
    MKAnnotationView* v = nil;
    if (]) {
      static NSString* ident = @&#34;Pin&#34;;
      v = ;
      if (v == nil)
      {
            v = [ initWithAnnotation:annotation reuseIdentifier:ident];
            ((MKPinAnnotationView*)v).pinColor = MKPinAnnotationColorRed;
            UIButton *infoButton = ;
            v.rightCalloutAccessoryView = infoButton;
            v.centerOffset= CGPointMake(0,-20);
            v.canShowCallout= YES;
      }
      v.annotation = annotation;
    }
    return v;
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 点按即可从 pin 的注释披露中获取坐标,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/23663568/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/23663568/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 点按即可从 pin 的注释披露中获取坐标