我有注释的列表(MKPointAnnotation)。 我有一个UIViewController这是整个视图,执行的MKMapView控制,我认为是用于检测与地图,告诉您如何显示注释的用户互动,我自己MKPointAnnotation实现(子类)控制器有用。
不过我在检测用户敲打事件的袭击。
谷歌搜索告诉我,我必须实现以下功能做一些事情。
- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
而且,我必须在一些类,它实现MapViewDelegate(协议)实现这一点。
但我所有的困惑,无法前进。 谁能告诉我在哪里做什么呢?
对不起,所有的大惊小怪!
有检测与标注视图的用户交互的两种方式。 常见的方法是定义一个标注(你看,当你在一个典型的地图应用一针一敲这个标准有点酥料饼泡)为您MKAnnotationView
。 与您建立在标准的注解注释视图viewForAnnotation
方法:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
if ([annotation isKindOfClass:[MKUserLocation class]])
return nil;
MKAnnotationView *annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"loc"];
annotationView.canShowCallout = YES;
annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
return annotationView;
}
通过这样做,你会得到一个标注,但你添加附件的权利,这是在我上面的例子中,披露的指标。 这样,他们挖掘您的注解视图(我在上面的例子中,地图上的销),他们看到了标注,而当他们上标注的右附件(在这个例子中,小披露指标)自来水,你calloutAccessoryControlTapped
被称为(在我的例子下面,执行SEGUE一些细节视图控制器):
- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
[self performSegueWithIdentifier:@"DetailsIphone" sender:view];
}
这是小的iPhone屏幕上一个非常典型的用户体验。
但是,如果你不喜欢UX和你不想标准标注,而是你想要的东西别的事情发生,你可以定义你MKAnnotationView
使未示出的标注,而是你拦截它,并做一些事情其他(例如,iPad上的应用程序的地图,你可能会表现出一些更复杂的酥料饼而不是标准的标注)。 例如,你可以有你的MKAnnotationView
不显示标注:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
if ([annotation isKindOfClass:[MKUserLocation class]])
return nil;
MKAnnotationView *annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"loc"];
annotationView.canShowCallout = NO;
return annotationView;
}
但是,你可以手动处理didSelectAnnotationView
当用户在您的挖掘探测MKAnnotationView
,在这个例子中呈现出酥料饼:
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
{
[mapView deselectAnnotation:view.annotation animated:YES];
DetailsViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailsPopover"];
controller.annotation = view.annotation;
self.popover = [[UIPopoverController alloc] initWithContentViewController:controller];
self.popover.delegate = self;
[self.popover presentPopoverFromRect:view.frame
inView:view.superview
permittedArrowDirections:UIPopoverArrowDirectionAny
animated:YES];
}
我包括在上面的代码中产生了一些用户界面屏幕快照, 我的答案在这里 。
剥夺例如用于夫特3:
class MapViewController: UIViewController
{
override func viewDidLoad()
{
super.viewDidLoad()
// Create map view in storyboard
view.delegate = self
}
}
extension MapViewController: MKMapViewDelegate
{
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView?
{
let annotationView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "annotationView")
annotationView.canShowCallout = true
annotationView.rightCalloutAccessoryView = UIButton.init(type: UIButtonType.detailDisclosure)
return annotationView
}
func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl)
{
guard let annotation = view.annotation else
{
return
}
let urlString = "http://maps.apple.com/?sll=\(annotation.coordinate.latitude),\(annotation.coordinate.longitude)"
guard let url = URL(string: urlString) else
{
return
}
UIApplication.shared.openURL(url)
}
}
在此方法中添加按钮
-(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
pinView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
pinView.canShowCallout = YES;
}
Then callout method
- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
InfoView *infoView = [[InfoView alloc]initWithNibName:@"InfoView" bundle:nil];
[self.navigationController pushViewController:infoView animated:YES];
}