2015-03-21 7 views
1

В настоящее время у меня возникает проблема с моим проектом в реализации пользовательского MKAnnotationView, который имеет несколько пользовательских UIImageView. Таким образом, у этих пользовательских UIImageViews есть четкая кнопка поверх них, чтобы не добавлять знаменателей жестов.MKAnnotationView Subviews

enter image description here

Как вы можете видеть, это было бы полезно, чтобы на самом деле нажмите на подвиды MKAnnotationView и имеют какое-то действие происходит.

Я реализовал протокол для MKAnnotationView, где каждое изображение подтаблица в MKAnnotationView делает обратный вызов к контроллеру, который владелец MKMapView ... Heres код ...

PHProfileImageView *image = [[PHProfileImageView alloc] initWithFrame:CGRectMake(newX - radius/5.0f, newY - radius/5.0f, width, height)]; 
     [image setFile:[object objectForKey:kPHEventPictureKey]]; 
     [image.layer setCornerRadius:image.frame.size.height/2]; 
     [image.layer setBorderColor:[[UIColor whiteColor] CGColor]]; 
     [image.layer setBorderWidth:2.0f]; 
     [image.layer setMasksToBounds:YES]; 
     [image.profileButton setTag:i]; 
     [image.profileButton addTarget:self action:@selector(didTapEvent:) forControlEvents:UIControlEventTouchUpInside]; 
     [self addSubview:image];   


- (void)didTapEvent:(UIButton *)button 
{ 
    NSLog(@"%@", [self.pins objectAtIndex:button.tag]); 
    if (self.delegate && [self.delegate respondsToSelector:@selector(didTapEvent:)]) { 
     [self.delegate JSClusterAnnotationView:self didTapEvent:[self.pins objectAtIndex:button.tag]]; 
    } 
} 

Так как вы я вижу, что я уже пытаюсь записать результат воспроизведенного изображения, но ничего :(Является ли способ, которым я реализую это не для того, чтобы идти? Я должен иметь CAShapeLayers или что-то в этом роде? получили какие-либо идеи?

Редактировать

Im думает, что мне, возможно, придется реализовать пользовательский вид выноски. Поскольку вид выноска фактически добавляет кнопки в его представление и может реагировать на события касания ... Не совсем уверен, хотя из-за того, что выноски отображаются только после прослушивания аннотации. И в этом случае ANTUAL-аннотация представляет собой среднюю метку

Итак, я изменил размер кадра mkannotationview на гораздо больший кадр, и, судя по всему, все подзоны на самом деле не находятся в границах MKAnnotationView, поэтому субподзоры фактически не используются , Теперь, когда я думал об этом решении, это, вероятно, было не лучшим решением.

Если у кого-то есть предложения, а не добавления subviews в MKAnnotationView, чтобы создать представление, которое я сейчас имею, это было бы здорово!

ответ

2

Для пользовательского аннотационного просмотра с помощью кнопок «Clickable» вам необходимо создать в проекте собственный пользовательский SubClass AnnotationView. Для этого создайте новый файл.

enter image description here

И добавьте эти два метода в файле реализации.

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event 
{ 
    UIView* hitView = [super hitTest:point withEvent:event]; 
    if (hitView != nil) 
    { 
     [self.superview bringSubviewToFront:self]; 
    } 
    return hitView; 
} 

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event 
{ 
    CGRect rect = self.bounds; 
    BOOL isInside = CGRectContainsPoint(rect, point); 
    if(!isInside) 
    { 
     for (UIView *view in self.subviews) 
     { 
      isInside = CGRectContainsPoint(view.frame, point); 
      if(isInside) 
       break; 
     } 
    } 
    return isInside; 
} 

Затем снова зайдите в файл ViewController.m и измените метод viewDidLoad как это.

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.mapKit.delegate = self; 

    //Set Default location to zoom 
    CLLocationCoordinate2D noLocation = CLLocationCoordinate2DMake(51.900708, -2.083160); //Create the CLLocation from user cordinates 
    MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(noLocation, 50000, 50000); //Set zooming level 
    MKCoordinateRegion adjustedRegion = [self.mapKit regionThatFits:viewRegion]; //add location to map 
    [self.mapKit setRegion:adjustedRegion animated:YES]; // create animation zooming 

    // Place Annotation Point 
    MKPointAnnotation *annotation1 = [[MKPointAnnotation alloc] init]; //Setting Sample location Annotation 
    [annotation1 setCoordinate:CLLocationCoordinate2DMake(51.900708, -2.083160)]; //Add cordinates 
    [self.mapKit addAnnotation:annotation1]; 
} 

Теперь добавьте этот пользовательский вид в ViewController.xib.

Теперь создайте этот метод делегата, как показано ниже.

#pragma mark : MKMapKit Delegate 

-(MKAnnotationView *)mapView:(MKMapView *)mV viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    AnnotationView *pinView = nil; //create MKAnnotationView Property 

    static NSString *defaultPinID = @"com.invasivecode.pin"; //Get the ID to change the pin 
    pinView = (AnnotationView *)[self.mapKit dequeueReusableAnnotationViewWithIdentifier:defaultPinID]; //Setting custom MKAnnotationView to the ID 
    if (pinView == nil) 
     pinView = [[AnnotationView alloc] 
        initWithAnnotation:annotation reuseIdentifier:defaultPinID]; // init pinView with ID 

    [pinView addSubview:self.customView]; 
    addSubview:self.customView.center = CGPointMake(self.customView.bounds.size.width*0.1f, -self.customView.bounds.size.height*0.5f); 

    pinView.image = [UIImage imageNamed:@"Pin"]; //Set the image to pinView 

    return pinView; 
} 

Я также получил этот ответ несколько месяцев назад от кого-то, опубликованного в Stackoverflow. Я изменил его в свой проект, как хочу. Надеюсь, это сработает.

+0

Так что, я просто должен был выполнить тест на попадание и указать внутри ... В моем описании вопроса я объясняю, что я реализую пользовательский MKAnnotationView. Тем не менее, это был тот ответ, который я искал. Большое спасибо! – jsetting32

Смежные вопросы