【问题标题】:How to add a uibutton to custom annotation view如何将 uibutton 添加到自定义注释视图
【发布时间】:2011-10-24 15:19:40
【问题描述】:

我创建了一个自定义注释视图。在 setSelected 方法中,我根据需要实现了一个视图,现在我想向该视图添加一个按钮。但是按钮没有检测到点击事件, 它被地图视图吸收。我应该怎么做才能添加像 rightcalloutaccessory 这样的按钮。 提前致谢。

【问题讨论】:

标签: iphone ios mkmapview mkannotationview


【解决方案1】:

我通过将UIButton 的控制事件更改为

解决了这个问题
[button addTarget:self action:@selector(clickEvent) forControlEvents:UIControlEventTouchDown]

下面是我创建自定义注释的部分代码。

    - (CustomAnnotationView *)mapView:(MKMapView *)aMapView viewForAnnotation:(id <MKAnnotation>)annotation
    {
        if ([annotation isKindOfClass:[CustomAnnotation class]])
        {
             CustomAnnotationView *newAnnotationView = nil;
    // determine the type of annotation, and produce the correct type of annotation view for it.

             newAnnotationView = [[[CustomAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:nil delegate: targetController] autorelease];
             [newAnnotationView setEnabled:YES];
             [newAnnotationView setCanShowCallout:NO];
             return newAnnotationView;
       }
    }





    @interface CustomAnnotationView : MKAnnotationView 
    {
    }
    @end


    @implementation CustomAnnotationView

    - (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier delegate:(id)targetController
    {
            self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
            /* Set initial width as you want. ex: 50X50*/
            self.frame = CGRectMake(0, 0, Initial_width, Initial_height); 
             self.backgroundColor = [UIColor redColor];
             return self;
    }

    /* When you tap on an annotation this method is fired*/ 
    - (void)setSelected:(BOOL)selected animated:(BOOL)animated
    {
        if(selected){
            /* When you select annotation, instead of showing default callout you can increase the width &height of annotation and add your custom view here*/ 
                self.frame = CGRectMake(0, 0, max_width, max_height);
                UIView *view = [[UIView alloc]initWithFrame:CGRectMake(6, 0, max_width-10, max_height)];
                view.backgroundColor = [UIColor blackColor];

                UIButton *but = [UIButton buttonWithType:UIButtonTypeCustom];       
                    UIImage *img = [UIImage imageNamed:@"image.png"];
                but = CGRectMake(x , y, img.size.width + 20,  img.size.height + 15);
                [but setImage:img forState:UIControlStateNormal];
                [but addTarget:targetController action:@selector(methodName) forControlEvents:UIControlEventTouchDown];
                [view addSubview:but];

                [self addSubview:view];
        }
        else {
                /* When you tap outside of annotation, set the initial frame for the annotation. and remove the custom view from annotation*/
                self.frame = CGRectMake(0, 0, Initial_width, Initial_height);
                [view removeFromSuperview];

            }
    }

【讨论】:

  • 你是如何阻止触摸事件表单冒泡到mapView:didSelectAnnotationView:函数的?
  • @san 你能帮我解决这个问题吗?这段代码对我不起作用。
  • @MuhammadUmar 有关详细信息,请参阅编辑后的代码。希望对你有用
  • @san 通过增加 self.frame 你使用的图钉不会改变它的大小?
  • @MuhammadUmar 从github下载示例代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多