5

次の画像の進行を見てください。

ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください

ここで起こっていることは、最初に「野球」を選択したことです。これにより、さまざまなレベルのビューが中央になるように、表示されている3つの灰色のビューが左に回転します(2番目の画像)。この時点で、ビューの幅が大幅に縮小されていることがわかります。3番目の画像は、スポーツ名を含むビューをクリックした後に表示され、中央に回転して戻ります。

私の知る限り、ビューが中央に回転すると、ビューの幅が狭くなります。しかし、その理由はわかりません。

関連するコードは次のとおりです。pos問題の場所を指しviewます。0中央に1あること、中央の右側にあること、中央-1の左側にあることなどを示します。

- (void)perspectiveView:(MenuSection *)view forPosition:(NSInteger)pos
{

    CALayer *layer = view.layer;
    CATransform3D transform = CATransform3DIdentity;

    MenuSection *prevView = (pos >= 0) ? (MenuSection *)[self viewWithTag:view.tag - 1] : (MenuSection *)[self viewWithTag:view.tag + 1];

    if (pos == 0) {
        view.changingToFrame = CGRectMake(round((480 - view.frame.size.width)/2), view.frame.origin.y, view.frame.size.width, view.frame.size.height);
        view.frame = view.changingToFrame;

    } else {

        if (pos == 1) {
            NSLog(@"%@",NSStringFromCGRect(prevView.changingToFrame));
            view.changingToFrame = CGRectMake(round(prevView.changingToFrame.origin.x + prevView.frame.size.width + 20), view.frame.origin.y, view.frame.size.width, view.frame.size.height);
            transform.m34 = 1.0 / 1000;
        } else if (pos == -1){
            view.changingToFrame = CGRectMake(round(prevView.changingToFrame.origin.x - view.frame.size.width - 20), view.frame.origin.y, view.frame.size.width, view.frame.size.height);
            transform.m34 = 1.0 / -1000;
        } else if (pos == 2){
            view.changingToFrame = CGRectMake(round(prevView.changingToFrame.origin.x + prevView.frame.size.width + 20), view.frame.origin.y, view.frame.size.width, view.frame.size.height);
            transform.m34 = 1.0 / 500;
        } else if (pos == -2){
            view.changingToFrame = CGRectMake(round(prevView.changingToFrame.origin.x - view.frame.size.width - 20), view.frame.origin.y, view.frame.size.width, view.frame.size.height);
            transform.m34 = 1.0 / -500;
        }

        view.frame = view.changingToFrame;

        transform = CATransform3DRotate(transform, 45.0f * M_PI / 180.0f, 0.0f, 1.0f, 0.0f);
    }

    layer.transform = transform;
}
4

2 に答える 2

7

私はそれを解決しました。適用すると、CATransform3D実際にビューのフレームが変更されることがわかります。私が投稿したコードでは、ビューの新しいフレームを設定するときに(別の位置に回転するため)、幅を維持するために単に使用view.frame.size.widthします。CGRectMake()しかし、CATransform3D以前に幅を変更していたので、実際の幅がわかりません。

解決策は、必要なものをサブクラス化しUIViews、元のフレームをivarに格納することでした。そうすれば、ビューを別の位置に移動するときの参照ポイントとして常にそれを使用できます。

于 2012-01-24T20:07:38.037 に答える
0

このエフェクトを機能させるために、CATransform3Dマトリックスを直接編集する必要はありません(m34など)。これを試して:

if (pos == 0) {
     view.changingToFrame = CGRectMake(round((480 - view.frame.size.width)/2), view.frame.origin.y, view.frame.size.width, view.frame.size.height);
    view.frame = view.changingToFrame;
} else {
    if (pos == 1) {
         view.changingToFrame = CGRectMake(round(prevView.changingToFrame.origin.x + prevView.frame.size.width + 20), view.frame.origin.y, view.frame.size.width, view.frame.size.height);
        transform = CATransform3DRotate(transform, M_PI/4.0f, 0.0f, 1.0f, 0.0f);
    } else if (pos == -1){
        view.changingToFrame = CGRectMake(round(prevView.changingToFrame.origin.x - view.frame.size.width - 20), view.frame.origin.y, view.frame.size.width, view.frame.size.height);
        transform = CATransform3DRotate(transform, -M_PI/4.0f, 0.0f, 1.0f, 0.0f);
    } else if (pos == 2){
        view.changingToFrame = CGRectMake(round(prevView.changingToFrame.origin.x + prevView.frame.size.width + 20), view.frame.origin.y, view.frame.size.width, view.frame.size.height);
        transform = CATransform3DRotate(transform, M_PI/3.0f, 0.0f, 1.0f, 0.0f);
    } else if (pos == -2){
        view.changingToFrame = CGRectMake(round(prevView.changingToFrame.origin.x - view.frame.size.width - 20), view.frame.origin.y, view.frame.size.width, view.frame.size.height);
        transform = CATransform3DRotate(transform, -M_PI/3.0f, 0.0f, 1.0f, 0.0f);
    }
    view.frame = view.changingToFrame;
}
layer.transform = transform;

そして、正しく見えるまでそれらの角度で遊んでください。

于 2012-01-24T19:39:37.120 に答える