iOS Mapkit自定义标注 [英] iOS Mapkit Custom Callout

查看:160
本文介绍了iOS Mapkit自定义标注的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是一个示例自定义标注,我希望得到类似的风格。我正在考虑从MKAnnotation继承,但我失去了如何启动它,我不知道标注的设计是否可以被覆盖。





如何使用ui控件实现这个自定义标注?



编辑:这是我的代码,来自类似的StackOverflow答案:

   - (MKAnnotationView *) mapView:(MKMapView *)mapview viewForAnnotation:(id< MKAnnotation>)注释
{
if([annotation isKindOfClass:[MKUserLocation class]])
return nil;
static NSString * AnnotationIdentifier = @AnnotationIdentifier;
MKAnnotationView * annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationIdentifier];
if(annotationView)
返回annotationView;
else
{
UIImage * img = [UIImage imageNamed:@default_thumb.png];

MKAnnotationView * annotationView =
[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier];
annotationView.canShowCallout = YES;
annotationView.image = img;
annotationView.draggable = YES;

/ *
//用图像更改左侧附件视图按钮
UIImageView * leftAccView = [[UIImageView alloc] initWithImage:img];
annotationView.leftCalloutAccessoryView = leftAccView;

//包括一个显示更多信息的右键
UIButton * rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[rightButton addTarget:self action:@selector(calloutSubMenu :) forControlEvents:UIControlEventTouchUpInside];
[rightButton setTitle:annotation.title forState:UIControlStateNormal];
annotationView.rightCalloutAccessoryView = rightButton;
* /

返回annotationView;
}
返回零;
}

//自定义附件视图
- (void)mapView:(MKMapView *)mapview annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
[mapview deselectAnnotation:view.annotation animated:YES];

PopOverCallout * popOverCallout = [[PopOverCallout alloc] init];

UIPopoverController * popOver = [[UIPopoverController alloc] initWithContentViewController:popOverCallout];

self.annotationPopoverController = popOver;

popOver.popoverContentSize = CGSizeMake(500,500);

[popOver presentPopoverFromRect:view.bounds inView:view allowedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}

 (void)mapView:(MKMapView *)mapview annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control 


?但是会发生一个空白的常规标注。我可能做错了什么?



BTW:UIViewController子类只在它的XIB上有一个标签,并且几乎是空白的。

解决方案

在几分钟的午睡后找到答案。



使用这个作为指南,我只需要覆盖

   - (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view 

显示注释标注。再次感谢安娜女士的回答。


Here's a sample custom callout that I'd want to get a similar style of. I was thinking of inheriting from MKAnnotation but I'm lost how to start it and I don't know if the callout's design could be overridden.

Any ideas how to implement this custom callout with ui controls inside?

EDIT: Here's my code from following the similar StackOverflow answer:

- (MKAnnotationView *)mapView:(MKMapView *)mapview viewForAnnotation:(id <MKAnnotation>)annotation
{
    if ([annotation isKindOfClass:[MKUserLocation class]])
        return nil;
    static NSString* AnnotationIdentifier = @"AnnotationIdentifier";
    MKAnnotationView *annotationView = [mapView dequeueReusableAnnotationViewWithIdentifier:AnnotationIdentifier];
    if(annotationView)
        return annotationView;
    else
    {
        UIImage *img = [UIImage imageNamed:@"default_thumb.png"];

        MKAnnotationView *annotationView = 
            [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier];
        annotationView.canShowCallout = YES;
        annotationView.image = img;
        annotationView.draggable = YES;

        /*
        // change left accessory view button with image
        UIImageView *leftAccView = [[UIImageView alloc] initWithImage:img];
        annotationView.leftCalloutAccessoryView = leftAccView;

        //include a right button to show more info         
        UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        [rightButton addTarget:self action:@selector(calloutSubMenu:) forControlEvents:UIControlEventTouchUpInside];
        [rightButton setTitle:annotation.title forState:UIControlStateNormal];
        annotationView.rightCalloutAccessoryView = rightButton;         
         */

        return annotationView;
    }
    return nil;
}

// Customize accessory view
- (void)mapView:(MKMapView *)mapview annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
    [mapview deselectAnnotation:view.annotation animated:YES];

    PopOverCallout *popOverCallout = [[PopOverCallout alloc]init];

    UIPopoverController *popOver = [[UIPopoverController alloc] initWithContentViewController:popOverCallout];

    self.annotationPopoverController = popOver;

    popOver.popoverContentSize = CGSizeMake(500, 500);

    [popOver presentPopoverFromRect:view.bounds inView:view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];    
}

The

(void)mapView:(MKMapView *)mapview annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control

should be called whenever the pin is touched to show the callout right? but what happens is that a blank regular callout is shown. What might I be doing wrong?

BTW: the UIViewController subclass only has a label on it's XIB and is pretty much blank.

解决方案

Found out the answer after a few mins of nap.

using this as the guide, I just needed to override

-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view

which shows the annotation callout. Thanks again for the answer, Ms. Anna.

这篇关于iOS Mapkit自定义标注的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆