2

だから、私は難しい質問をしているように見えますが、ここでもう一度言います。

奇妙な問題のように見えるものがあります。一部のビューでは、上部のツールバーを x 軸に沿って 90 度回転させて非表示にしています。次に、ユーザーがそれらを「プルダウン」できるようにします。これにより、ビューが 0 度に回転し、ツールバーが表示されます。プルダウンするツールバーが 2 つある 1 つのビューを除いて、すべてうまく機能します。これは、最初のツールバーを下に回転させ、次に 2 番目のツールバーを下に回転させ、最初のツールバーを 2 番目のツールバーの高さだけ下に移動させることによって機能します。これらはすべて、非 Retina ディスプレイで正常に機能します。ただし、Retina ディスプレイでは、最初のツールバーのディスプレイスメントは本来あるべきものの半分にすぎません。さらに、ビューのフレームはまさにあるべきものです。つまり、(NSLog) をチェックすると、次のフレーム{0, 30, 320, 30}が表示されますが、実際の画像はフレームに表示されます。{0, 15, 320, 30}. ずらしたのは背景だけです。ビューがあるはずのスペースをクリックすると、タッチイベントが通過します。

これは、Retina スクリーンで起こっていることです。

ここに画像の説明を入力

Retina 以外の画面では次のようになります (まったく同じコード)。

ここに画像の説明を入力

これは、ビューを回転させるために使用するコードです (非常に単純です):

- (void) rotateView:(UIView *)view downBy:(CGFloat)rad{
    CALayer *rLayer = view.layer;
    CGFloat zDist = self.view.window.bounds.size.height * 1.5f;
    CATransform3D rT = CATransform3DIdentity;
    rT.m34 = 1.0f /  -zDist;
    rT = CATransform3DRotate(rT, rad, 1.0f, 0.0f, 0.0f);
    rLayer.transform = rT;
}

繰り返しますが、これは Retina ディスプレイでのみ発生します。

現在、ツールバーは Core Graphics でレンダリングされています。そこで、drawRect からコードを完全に削除して、問題の原因となっている CG コードを排除し、draw rect にコードがまったくないようにしました。問題はまだ発生します。また、drawRect を使用しない (メソッド全体をコメントアウトする) と、回転は正しく行われますが、すべてのサブビュー (コア グラフィックスも使用する) が 1/2 の解像度でレンダリングされるため、すべてがぼやけて見えることにも注意してください。

ここに画像の説明を入力

変換と関係があると思いますが、その方法や理由はわかりません。回転を 0 ラジアンに戻した後にレイヤー変換を ID に設定すると (完全に表示されるようになります)、ビューは正しい位置にスナップされます。また、0 ラジアンでは、変換が完全に同一ではないことにも注意しました。m34 (遠近法) はまだ設定されています。ゼロに戻すと問題は解決します。ただし、ビューが 0 rad 以外の他の回転にある間は、ゼロに設定しても問題は解決しません。原点 {0,0} から下に回転していないビューは、まだシフトされています。すべての変換を確認して確認しましたが、問題は 3D 変換中に発生するようです。

アップデート

@Joshua Weinbergの回答により、レイヤーのrasterizationScaleをいじり始めました。私が発見したのは、下にある画像のオフセットが 1/rasterizationScale だけずれていたことです。したがって、rasterizationScale を 6 に設定し、ビューを 30 だけ下に移動すると、背景画像は 30/6 (5.0f) だけ下に移動します。

更新 2

画像を下に翻訳するハックを試みました。画像が適切な量だけ下に移動するという点で機能しますが、画像が消えることもあります。したがって、私のローテーションメソッドのこのコード:

rT = CATransform3DTranslate(rT, view.frame.origin.x - (view.frame.origin.x / rLayer.rasterizationScale), view.frame.origin.y - (view.frame.origin.y / rLayer.rasterizationScale), 0);

これをもたらします: ここに画像の説明を入力

4

2 に答える 2

1

私はそれを考え出した。私が苦労してきたビューコントローラーは、カスタム分割ビューコントローラーとして構築したカスタムコンテナーコントローラーにありました。そのコントローラーは、ビュー ペインを切り替えるときにも 3D 変換を利用していました。トランジションの最後に、.m34 (透視変換) をそのままにしました。どうやらこれが私が抱えていたすべての問題を引き起こしていたようです。コンテナー コントローラーでビューを切り替えるときに、レイヤーのトランスフォームを ID に設定するようにしましたが、すべて正常に動作するようになりました。

したがって、この話の教訓は、サブレイヤーを変換する前に、常にスーパーレイヤーが恒等変換であることを確認してください。そうしないと、予期しない結果が生じる可能性があります。

于 2012-03-21T22:37:05.090 に答える
0

rasterizationScaleレイヤーの を に設定する[[UIScreen mainScreen] scale]と、機能するはずです。3D 変換を適用すると、レイヤーがラスタライズされます。デフォルトのラスタライズは 1.0f です。

于 2012-03-21T18:48:34.137 に答える