Добавление подпредставления в MKMapView над картой, но под аннотациями?
Вопрос
Для приложения, которое я создаю, у меня есть пользовательская " старая карта " эффект PNG, который я хотел бы наложить на представление MKMapView. К сожалению, ни один из способов, которыми я пытался это сделать, не является абсолютно правильным:
<Ол>Чего я в основном хочу добиться, так это иметь подпредставление, расположенное над слоями, но под аннотациями, и оно будет оставаться устойчивым, пока пользователь прокручивает вокруг & # 8212; какие-либо мысли?
Решение
Обратите внимание, что иерархия, подпункты, аннотации, поведение и т. д. всех MKMapView
выполняются во внутреннем частном Класс MKMapViewInternal , поэтому изменение чего-либо (так, как я предлагаю, или другое) в этой структуре может привести к отклонению вашего приложения из Appstore.
У меня нет полного решения, просто идея. Моя идея состоит в том, чтобы сделать представление наложения таким же суперпредставлением, как представления аннотации, и обеспечить, чтобы аннотации были размещены поверх нашего наложения. В MKMapViewDelegate мы реализуем:
- (void)mapView:(MKMapView *)aMapView didAddAnnotationViews:(NSArray *)views{
if (views.count > 0){
UIView* tView = [views objectAtIndex:0];
UIView* parView = [tView superview];
UIView* overlay = [tView viewWithTag:2000];
if (overlay == nil){
overlay = [[UIImageView alloc] initWithImage:[UIImage imageNamed:MY_IMAGE_NAME]];
overlay.frame = parView.frame; //frame equals to (0,0,16384,16384)
overlay.tag = 2000;
overlay.alpha = 0.7;
[parView addSubview:overlay];
[overlay release];
}
for (UIView* view in views)
[parView bringSubviewToFront:view];
}
}
Этот код выполняет половину того, что вы хотите - вы получаете вид, размещенный между плитками карты и аннотациями. Оставшаяся задача - изменить пользовательский оверлей в соответствии с прокруткой / масштабированием карты (я опубликую, если найду способ).
Другие советы
Я сделал что-то похожее и по-другому в конце. Я хотел добавить вид карты, добавив белое наложение, но я не хотел исчезать аннотации. Я добавил на карту наложение (на самом деле мне пришлось добавить два, поскольку мне не нравилось пытаться добавить наложение для всего земного шара).
CLLocationCoordinate2D pt1, pt2, pt3, pt4;
pt1 = CLLocationCoordinate2DMake(85, 0);
pt2 = CLLocationCoordinate2DMake(85, 180);
pt3 = CLLocationCoordinate2DMake(-85, 180);
pt4 = CLLocationCoordinate2DMake(-85, 0);
CLLocationCoordinate2D coords[] = {pt1, pt2, pt3, pt4};
MKPolygon *p = [MKPolygon polygonWithCoordinates:coords count:4];
[self.mapView addOverlay:p];
pt1 = CLLocationCoordinate2DMake(85, 0);
pt2 = CLLocationCoordinate2DMake(85, -180);
pt3 = CLLocationCoordinate2DMake(-85, -180);
pt4 = CLLocationCoordinate2DMake(-85, 0);
CLLocationCoordinate2D coords2[] = {pt1, pt2, pt3, pt4};
MKPolygon *p2 = [MKPolygon polygonWithCoordinates:coords2 count:4];
[self.mapView addOverlay:p2];
Затем вам нужно добавить делегата карты для их отрисовки:
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay {
if ([overlay isKindOfClass:MKPolygon.class]) {
MKPolygonRenderer *polygonView = [[MKPolygonRenderer alloc] initWithOverlay:overlay];
polygonView.fillColor = [UIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:255.0/255.0 alpha:0.4];
return polygonView;
}
return nil;
}
Он довольно старый, но, возможно, все еще актуален для некоторых из вас.
Я хотел сделать карту темнее, но не аннотации.
То, что я сделал, было очень просто, и я пока не знаю, есть ли у него запасные варианты ...
Я поместил UIView
с прозрачным черным фоном над MKMapView
, а затем добавил следующий код:
- (void)mapView:(MKMapView *)mapView didAddAnnotationViews:(NSArray<MKAnnotationView *> *)views
{
for (MKAnnotationView *view in views) {
view.center = [self.mapView convertCoordinate:view.annotation.coordinate toPointToView:self.viewDark];
[self.viewDark addSubview:view];
}
}
Надеюсь, что это поможет .. и, конечно, - если вы обнаружите какие-либо проблемы с этим решением, пожалуйста, сообщите мне:)
Изменить # 1:
Забыл упомянуть, что для self.viewDark
должно быть отключено userInteraction
.
Изменить # 2:
Еще одна вещь, которая помогла мне, - установить для self.viewDark
autoresizesSubviews
значение NO
.