Как добавить представления изображений в пользовательский вид аннотаций, чтобы закрепить изображение на экране и получать от него штрихи?

#ios #mapkit #mkannotation #mkannotationview #mkpinannotationview

#iOS #mapkit #mkannotation #mkannotationview #mkpinannotationview

Вопрос:

У меня есть mapview с выводами, которые показывают местоположение фотографии (координаты взяты из CoreData), и мне нужно показывать фотографию при выборе pin-кода (используя его URL и AFNetworking).

Мне нужно сохранить как изображение pin-кода, так и изображение фотографии, когда выбран pin-код.

Если выбран следующий пин-код, предыдущий пин-код отменяется, поэтому я удаляю фотографию с экрана и добавляю другую фотографию соответствующего пин-кода.

Вот изображение, чтобы показать, что мне особенно нужно:

введите описание изображения здесь

Итак, pin-код отображается на экране, а фотография отображается на экране.

Проблемы:

  1. Эта задача предназначена для iPhone, поэтому использование всплывающего окна недоступно.
  2. Мне нужно сохранить как изображение pin-кода, так и фотографию, а не изображение вместо pin-кода. Вот почему я не могу просто использовать свойство ‘image’ класса MKPinAnnotationView — оно устанавливает изображение вместо pin.
  3. У MK есть несколько частных классов для своих представлений, поэтому использование поиска по штрихам является проблемой.

Решение первой и второй проблемы:
я создал пользовательский класс MKPinAnnotationView, который отвечает за добавление ImageView в MKPinAnnotationView, чтобы сохранить изображение и фотографию на экране.

 #import "PSMKPinAnnotationView.h"
//my custom annotations, I keep URLs and coordinates of photos   there.
#import "PSMapAnnonation.h" 
#import "UIImageView AFNetworking.h" //to display images by URL

@interface PSMKPinAnnotationView ()

@property (nonatomic, strong) UIImageView *imageViewForAnnotaion;

//property in header is:
//@property (nonatomic, getter = isDetailViewHidden) BOOL detailViewHidden;
@end

@implementation PSMKPinAnnotationView

- (BOOL)validAnnotation
{
 return  [self.annotation isKindOfClass:[PSMapAnnonation class]]; 
}


- (void)setDetailViewHidden:(BOOL)detailViewHidden
{

//draw image in custom view
if (detailViewHidden==NO)
{
    if ([self validAnnotation])
    {
        self.annotation=(PSMapAnnonation*)self.annotation;
        CGRect rect=CGRectMake(0, -35, 30, 30);  // y=-35 to make correct offset

        self.imageViewForAnnotaion = [[UIImageView alloc] initWithFrame:rect];

        [self.imageViewForAnnotaion setImageWithURL: 
        [(PSMapAnnonation*)self.annotation    imageURL]];

        [self setClipsToBounds:NO];
        [self addSubview:self.imageViewForAnnotaion];
    }

 }

 else if (detailViewHidden==YES)
 {
    if ([self validAnnotation])
    {
        [self.imageViewForAnnotaion removeFromSuperview]];
    }
 }

}
  

В ViewController, где мой mapview находится в методах MapView, я делаю это:

 - (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(PSMKPinAnnotationView   
*)view
{
if ([view.annotation isKindOfClass:[MKUserLocation class ]]) return;

view.detailViewHidden=NO;
}

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

{

if (![view isKindOfClass:[PSMKPinAnnotationView class]]) {
return; //blue point which describes currecnt user position is a view pin too
        //and in case of being selected without this check app will crash.  
}

PSMKPinAnnotationView *customAnnotationView=(PSMKPinAnnotationView*)view;
[customAnnotationView setDetailViewHidden:YES];

} 
  

Итак, я нашел решение для первых двух проблем:

Результат таков:

введите описание изображения здесь

Но третья проблема была обнаружена во время поиска по сенсорным представлениям om MKMapView

 #pragma mark - Touches
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{

    NSLog(@"touch");
    UITouch *touch = [[event allTouches] anyObject];
    CGPoint touchLocation = [touch locationInView:self.mapView];

    for (UIView *view in self.mapView.subviews)
    {
      if ([view isKindOfClass:[PSMKPinAnnotationView class]] amp;amp;
        CGRectContainsPoint(view.frame, touchLocation))
     {
        NSLog(@"%@",[view class]);
    }


    NSLog(@"%@",[view class]);
   }
 }
  

Журналы показывают мне некоторые частные классы Apple:

 - 2014-06-19  11:00:45.428 PhotoShare[881:60b] touch
- 2014-06-19 11:00:45.428  PhotoShare[881:60b] UIView
- 2014-06-19 11:00:45.428  PhotoShare[881:60b] MKAttributionLabel
- 2014-06-19 11:01:47.574  PhotoShare[881:60b] touch
- 2014-06-19 11:01:47.575  PhotoShare[881:60b] UIView
- 2014-06-19 11:01:47.575  PhotoShare[881:60b] MKAttributionLabel
  

В случае касания моей фотографии (ее изображения) мой пользовательский класс для просмотра не обнаруживается, и отображаются некоторые MKAttributionLabel и UIView

  • Есть ли какое-нибудь простое решение для этого?

  • Как подключить штрихи к добавленному ImageView и найти их в представлениях? Журналы показали мне, что MapKit добавляет некоторые собственные представления, такие как MKAttributionLabel (частные классы Apple)?