#ios #mapkit #mkannotation #mkannotationview #mkpinannotationview
#iOS #mapkit #mkannotation #mkannotationview #mkpinannotationview
Вопрос:
У меня есть mapview с выводами, которые показывают местоположение фотографии (координаты взяты из CoreData), и мне нужно показывать фотографию при выборе pin-кода (используя его URL и AFNetworking).
Мне нужно сохранить как изображение pin-кода, так и изображение фотографии, когда выбран pin-код.
Если выбран следующий пин-код, предыдущий пин-код отменяется, поэтому я удаляю фотографию с экрана и добавляю другую фотографию соответствующего пин-кода.
Вот изображение, чтобы показать, что мне особенно нужно:
Итак, pin-код отображается на экране, а фотография отображается на экране.
Проблемы:
- Эта задача предназначена для iPhone, поэтому использование всплывающего окна недоступно.
- Мне нужно сохранить как изображение pin-кода, так и фотографию, а не изображение вместо pin-кода. Вот почему я не могу просто использовать свойство ‘image’ класса MKPinAnnotationView — оно устанавливает изображение вместо pin.
- У 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)?