マップの上にあるが注釈ビューの下にあるサブビューをMKMapViewに追加しますか?

StackOverflow https://stackoverflow.com/questions/1622633

質問

作成中のアプリには、カスタムの「古いマップ」があります。 MKMapViewビューにオーバーレイするエフェクトPNG。残念ながら、私がこれを試みた方法はどちらも正確ではありません:

  1. サブビューをMKMapViewに追加します(問題:PNGのUIImageViewは、奇妙に見える注釈ピンのに配置されます
  2. 画像を注釈ビューにし、他の画像の下に配置します(問題:スクロール時に、注釈ビュー画像を移動する必要があります。しばらくの間は、昔ながらの効果の代わりに通常のマップがあります) 。

基本的に達成したいことは、マップビューの上にあるが注釈ビューの下にあるサブビューを作成することです。サブビューは、ユーザーが考えをスクロールしている間も安定しています。

役に立ちましたか?

解決

すべての 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 に設定することです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top