【问题标题】:Subclasses of MKAnnotationViewMKAnnotationView 的子类
【发布时间】:2010-10-22 05:44:56
【问题描述】:

我想知道是否有人知道 MKAnnotationView 类的任何子类。在苹果文档中,他们说一个示例是 MKPinAnnotationView,所以我想知道是否还有其他预先创建的子类,例如用于跟踪设备当前位置的子类。如果有人有关于创建我自己的 MKAnnotationView 类的子类的提示,那也很棒。

谢谢, 大佬

【问题讨论】:

    标签: objective-c cocoa-touch mapkit mkannotationview


    【解决方案1】:

    如果有人仍然对此感兴趣:

    您可以使用 Objective-C 运行时函数获取一个类的所有子类,如下所述:http://cocoawithlove.com/2010/01/getting-subclasses-of-objective-c-class.html

    其他继承自 MKAnnotationView 的类有:

    MKTransitCalloutView、MKAdAnnotationView、MKUserLocationView、MKUserLocationBreadCrumbView 和 MKPinAnnotationView

    MKPinAnnotationView 是唯一记录在案的。所有其他都是 Apple 内部使用的私有类。

    【讨论】:

      【解决方案2】:

      我不知道任何其他模板,但这并不意味着它们不存在。 :)

      无论如何,以下是创建自定义的方法: 创建一个符合MKAnnotation 协议的新类。您需要有两个名为 titlesubtitleNSString* 类型的实例变量和一个名为坐标的 CLLocationCoordinate2D 类型的实例变量和一个适当的设置方法(例如属性)。这些字符串将显示在标注中。在 mapView 的委托中,以与实现 UITableView 的数据源类似的方式实现方法 -mapView:viewForAnnotation:。也就是说,通过标识符使 annotationView 出队,设置新属性(例如,右侧附件视图的 UIButtonTypeDetailDisclosure 类型的按钮)。您将需要添加一个图像以显示在偏移下方。只需使用 MKAnnotationView 的 image 属性。您的自定义图像的中心将放置在指定的坐标处,因此您可能需要提供一个偏移量:aView.centerOffset = CGPointMake(0, -20)

      这里是一些示例代码:

      - (MKAnnotationView *) mapView: (MKMapView *) mapView viewForAnnotation: (id<MKAnnotation>) annotation {
          // reuse a view, if one exists
          MKAnnotationView *aView = [mapView dequeueReusableAnnotationViewWithIdentifier:@"pinView"];
      
          // create a new view else
          if (!aView) {
              aView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"pinView"];
          }
      
          // now configure the view
          aView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
          [(UIButton*)aView.rightCalloutAccessoryView addTarget:self action:@selector(showDetails:) forControlEvents:UIControlEventTouchUpInside];
          aView.canShowCallout = YES;
          aView.enabled = YES;
          aView.image = [UIImage imageNamed:@"green_pin.png"];
          aView.centerOffset = CGPointMake(0, -20);
      
          return aView;
      }
      

      【讨论】:

      • 感谢您的帮助。我还想知道是否有办法在将注释放置在地图上后移动它?
      • 只需将其注解的坐标设置为新值即可。 mapView 使用 key-value-observing 来通知其注解的任何更改,并为您完成其余的工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-15
      • 1970-01-01
      • 2012-05-16
      相关资源
      最近更新 更多