マップの上にあるが注釈ビューの下にあるサブビューをMKMapViewに追加しますか?
質問
作成中のアプリには、カスタムの「古いマップ」があります。 MKMapViewビューにオーバーレイするエフェクトPNG。残念ながら、私がこれを試みた方法はどちらも正確ではありません:
- サブビューをMKMapViewに追加します(問題:PNGのUIImageViewは、奇妙に見える注釈ピンの上に配置されます
- 画像を注釈ビューにし、他の画像の下に配置します(問題:スクロール時に、注釈ビュー画像を移動する必要があります。しばらくの間は、昔ながらの効果の代わりに通常のマップがあります) 。
基本的に達成したいことは、マップビューの上にあるが注釈ビューの下にあるサブビューを作成することです。サブビューは、ユーザーが考えをスクロールしている間も安定しています。
解決
すべての 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];
}
}
このコードは、目的の半分を実行します。マップタイルと注釈の間にビューが配置されます。残りのタスクは、マップのスクロール/ズームに従ってカスタムオーバーレイビューフレームを変更することです(方法が見つかったら投稿します)。
他のヒント
最終的には、似たようなことをして、別の方法でやった。白いオーバーレイを追加してマップビューをフェードアウトしたかったのですが、注釈をフェードアウトしたくありませんでした。地図にオーバーレイを追加しました(実際には、地球全体にオーバーレイを追加するのが気に入らなかったため、2つ追加する必要がありました)。
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;
}
かなり古いですが、一部のユーザーにとってはまだ関連性があります。
注釈ビューではなく、マップを暗くしたかった。
私がやったことは非常に簡単で、フォールバックがあるかどうかまだわかりません...
MKMapView
の上に黒の透明な背景を持つ UIView
を配置し、次のコードを追加しました:
- (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
に設定することです。