Добавить изображение за MKPinAnnotationView
Я пытаюсь добавить изображение за MKPinAnnotationView. Похоже, это должно быть довольно просто сделать здесь:
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray *)views {
for (MKAnnotationView *aView in views)
[[aView superview] addSubview:imageView];
}
Но проблема, которую я имею при этом, заключается в том, что дочернее подпредставление к булавке будет отображаться поверх него, а не позади.
Я также попробовал:
for (MKAnnotationView *aView in views)
[[aView superview] insertSubview:imageView atIndex:1];
Проблема в том, что, хотя он находится за булавкой, как только карта перемещается, изображение выпадает из экрана.
Какие-либо предложения? Спасибо
3 ответа
Спасибо за вклад, вот в основном то, что я закончил делать без подклассов:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id )annotation {
MKAnnotationView *annView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:nil];
UIImage *image = [UIImage imageNamed:@"image.png"];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
[annView addSubview:imageView];
[imageView release];
MKPinAnnotationView *pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:nil];
[annView addSubview:pinView];
[pinView release];
return annView;
}
Мне нужен был только один штифт, поэтому я установил reuseIdentifier
в nil
,
Я подкласс MKAnnotatonView
и преодолеть initWithAnnotation:resueIdentifier
а также drawRect
методы, чтобы добавить другое изображение позади "переднего" изображения.
Кажется, это то, что Apple, MKAnnotationView
Ссылка на класс предлагает нам сделать.
Только то, что это сложно. Если вы подкласс MKAnnotationView
есть еще свойство изображения. Они что-то сделали правильно, чтобы это было связано с рисованием. Возможно, они переопределили drawRect для рисования изображения ПОСЛЕ инициализации.
Кроме того, если вы не установите свойство изображения, рамка вашего пользовательского annotationView
устанавливается на размер 0, а drawRect
метод не вызывается.
Наконец, Apple утверждает, что изображения должны быть полностью заполнены, т.е. использовать прозрачный цвет для фона рисунков.
Итак: в вашем подклассе:
- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)identifier
{
self = [super initWithAnnotation:annotation reuseIdentifier:identifier];
if (self)
{
UIButton *rightButton = [UIButton buttonWithType: UIButtonTypeDetailDisclosure];
[rightButton addTarget:self
action:@selector(myShowAnnotationAddress:)
forControlEvents:UIControlEventTouchUpInside];
self.rightCalloutAccessoryView = rightButton;
self.canShowCallout = YES;
self.multipleTouchEnabled = NO;
self.frame = CGRectMake(0, 0, 65, 100);
self.backgroundColor = [UIColor clearColor];
return self;
}
return nil;
}
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
CGPoint drawPoint = CGPointMake(0.0f, 0.0f);
UIImage *shadowImage = [UIImage imageNamed:@"shadow_image.png"];
[shadowImage drawAtPoint:drawPoint];
UIImage *frontImage = [UIImage imageNamed:@"front_image.png"];
[frontImage drawAtPoint:drawPoint];
CGContextRestoreGState(context);
}
После того как я сделал ответ, я понимаю, что вы на самом деле хотели отстать MKPinAnnotationView
, Мой ответ не тот, хотя он показывает, где рисование, возможно, должно быть сделано. очевидно MKPinAnnottions
имеет собственный метод рисования для представления булавки и ее тени.
Я думаю, что, вероятно, вы можете получить изображение Pin из свойства self.image. Что касается тени, я не уверен... Это может быть использование метода рисования OPEN GL для добавления тени или просто комбинирование теневого изображения.
Наконец, изображение поставляется с анимацией. Я предполагаю, что именно здесь запускается анимация. На данном этапе, однако, я не проверял.
Создайте новый составной вид аннотации, который сначала добавляет ваше изображение, а затем фактический MKAnnotationView:
@implementation MyCustomAnnotationView
- (void) viewDidLoad
{
// First add the image to our subviews
UIImageView *view = [[UIImageView alloc] initWithImage: myImageProperty];
[self.view addSubview: view];
[view release];
// Then add the MKAnnotationView on top of it
MKAnnotationView *annotation = [[MKAnnotationView alloc] init];
[self.view addSubview: annotation];
[annotation release];
}
@end