6

私はかなり長い間マップの置き換えに取り組んできました。全体が にUIScrollView裏打ちされたで動作しCATiledLayerます。

マップを回転するには、レイヤー自体を回転させます。(使用CATransform3DMakeRotation)これまでのところかなりうまく機能します=)

しかし、レイヤーに送信されるsetZoomScaleメソッドを呼び出すCATransform3Dと、回転が0にリセットされます。

私の質問は、zoomscale適用された回転を失うことなく scrollView を設定する方法はありますか?

ピンチ ジェスチャについても同じ問題が存在します。

//追加情報

現在の位置を中心に回転するには、アンカー ポイントを編集する必要があります。たぶん、これはスケーリングの問題でもあります。

- (void)correctLayerPosition {
    CGPoint position    = rootView.layer.position;
    CGPoint anchorPoint = rootView.layer.anchorPoint;
    CGRect  bounds      = rootView.bounds;
    // 0.5, 0.5 is the default anchorPoint; calculate the difference
    // and multiply by the bounds of the view
    position.x              = (0.5 * bounds.size.width) + (anchorPoint.x - 0.5) *    bounds.size.width;
    position.y              = (0.5 * bounds.size.height) + (anchorPoint.y - 0.5) * bounds.size.height;
    rootView.layer.position = position;
}

- (void)onFinishedUpdateLocation:(CLLocation *)newLocation {
    if (stayOnCurrentLocation) {
        [self scrollToCurrentPosition];
    }
    if (rotationEnabled) {
        CGPoint anchorPoint        = [currentConfig layerPointForLocation:newLocation];
        anchorPoint.x              = anchorPoint.x / rootView.bounds.size.width;
        anchorPoint.y              = anchorPoint.y / rootView.bounds.size.height;
        rootView.layer.anchorPoint = anchorPoint;
        [self correctLayerPosition];
    }
}
4

1 に答える 1

7

デリゲート メソッドを実装scrollViewDidZoom:し、2 つの変換を連結して目的の効果を得ることができます。

- (void) scrollViewDidZoom:(UIScrollView *) scrollView
{
    CATransform3D scale = contentView.layer.transform;
    CATransform3D rotation = CATransform3DMakeRotation(M_PI_4, 0, 0, 1);

    contentView.layer.transform = CATransform3DConcat(rotation, scale);
}

編集

もっと簡単なアイデアがあります!回転変換がアタッチされた階層に別のビューを追加するのはどうですか? 提案された階層は次のとおりです。

  • ScrollView
    • ContentView - によって返されるものviewForZoomingInScrollView:
      • RotationView - 回転変換を持つもの
        • MapView - すべてのタイルを含むもの

ここでパフォーマンスを気にする必要はないと思います。試してみる価値はあります。

于 2012-08-24T07:17:12.247 に答える