2

MKOverlayRenderer がマップに渡された後、そのアルファ プロパティにアクセスして変更するにはどうすればよいですか?

実際、rendererForOverlayメソッドで alpha 属性を変更できます:

- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id <MKOverlay>)overlay
{
    if ([overlay isKindOfClass:[MKTileOverlay class]]) {

        MKTileOverlayRenderer *renderer = [[MKTileOverlayRenderer alloc] initWithTileOverlay:overlay];
        renderer.alpha = 0.6;
        return renderer;
    }
    return nil;
}

しかし、このメソッドは、オーバーレイを mapView に追加したときにのみ呼び出されますよね?

だから私の質問は:オーバーレイがマップ上に既にレンダリングされた後でも、このアルファ属性の値を変更および設定する可能性がある方法はありますか?

レンダラーを NSMutableArray に追加しようとしました:

 - (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id <MKOverlay>)overlay
{
    if ([overlay isKindOfClass:[MKTileOverlay class]]) {
        _allRenderer = [[NSMutableArray alloc] init];
        MKTileOverlayRenderer *renderer = [[MKTileOverlayRenderer alloc] initWithTileOverlay:overlay];

        renderer.alpha = 0.0;
        [_allRenderer addObject:renderer];
        return renderer;
    }
    return nil;
}

そして、作成したこのメソッドを呼び出すことで透明度を変更できます。

-(void)changeAlpha:(NSUInteger)index : (BOOL)isOpaque {

    if (isOpaque)
        [[_allRenderer objectAtIndex:index] setAlpha:0.0];
    else
        [[_allRenderer objectAtIndex:index] setAlpha:1.0];
}

これを行うためのより良い方法はありますか? アルファ値を設定するだけで、ちょっと遅いプロセスのようです。

実際には、OverlayRenderer のアルファ値を 0 から 1 に動的に切り替えて、1 つのオーバーレイを表示したり、非表示にしたり、別のオーバーレイを表示したり、非表示にしたりしたいと考えています。

4

2 に答える 2

1

したがって、基本的にできることは、異なるアルファを設定しようとするのではなく、.

オーバーレイの使用と削除、およびアルファの初期値の使用を切り替えることができます。

参考までに、次のリンクを試してください: https://github.com/mapbox/mbxmapkit/issues/7

これも: https://github.com/mapbox/mbxmapkit/issues/39

于 2016-10-14T09:37:17.617 に答える
0

わかりましたので、@Sharpkitsがコメントで述べたように、アルファ値で遊ぶのではなく、MKTileOverlayを追加/削除しました。

ほぼ期待通りの結果になりました。タイルが初めてレンダリングされるときに問題に直面しています。レンダリングはタイルごとに行われるため、いくつかの不具合が発生しました。

オーバーレイがレンダリングされている間、最初の 2 秒間はスピナーを表示する必要があると思います。

その遅延の後、タイル イメージを使用したアニメーションはスムーズに再生されます。

新しいタイルをレンダリングする必要があるため、ズームイン/ズームアウトするとまだグリッチ効果が発生します。

いくつかのコンテキスト

基本的には10枚の画像でアニメーションを作りたいと思っています。すべての画像は、特定のズーム レベル、特定の位置、および 15 分の時間間隔に従ってカットされます。

UISlider と再生/一時停止ボタンがあり、アニメーションの再生中に Slider の位置に応じて、特定のオーバーレイを削除または追加しています。Slider で tapGestureRecognizer を使用すると、表示する必要があるオーバーレイを表示している間に、「ビデオ」に戻ることができます。

-(void)showOverlay:(NSUInteger)index {

    for (int i = 0; i < [_allTileOverlay count]; i++) {
        if (i != index)
            [_mapView removeOverlay:[_allTileOverlay objectAtIndex:i]];
        else
            [_mapView addOverlay:[_allTileOverlay objectAtIndex:index]];
    }
}

これは、アニメーションの再生中に UISlider の位置に応じてオーバーレイを表示している部分です。

if ([_allTileOverlay count]>0) {
        if (_currentSlider.value>=[_allTileOverlay count]-1) {
            dispatch_async(dispatch_get_main_queue(), ^(void){
                //Run UI Updates
                [self showOverlay:0];
            });
            _currentSlider.value=0;
        }else{
            //scroll to desire position
            _currentSlider.value++;
            dispatch_async(dispatch_get_main_queue(), ^(void){
                //Run UI Updates
                [self showOverlay:_currentSlider.value];
            });
        }
    }

機能を完成させるためにやるべきことがいくつかありますが、私が期待していたすべての情報を得たので、この質問を閉じます.

于 2016-10-14T13:55:53.050 に答える