19

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

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

私が基本的に達成したいのは、マップタイルの上で注釈ビューの下に重ねられたサブビューを作成することです。これは、ユーザーがスクロールしている間も安定して保持されます。何か考えはありますか?

4

3 に答える 3

5

すべての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];
    }
}

このコードは、目的の半分を実行します。マップ タイルと注釈の間に配置されたビューを取得します。残りのタスクは、マップのスクロール/ズームに応じてカスタム オーバーレイ ビュー フレームを変更することです (方法が見つかったら投稿します)。

于 2010-01-15T12:18:25.070 に答える
1

私は最終的に似たようなことを別の方法で行いました。白いオーバーレイを追加してマップビューをフェードアウトしたかったのですが、注釈をフェードアウトしたくありませんでした。地図にオーバーレイを追加しました (実際には、地球全体にオーバーレイを追加しようとするのが気に入らなかったので、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;
}
于 2016-03-17T23:19:12.893 に答える