だから、私は難しい質問をしているように見えますが、ここでもう一度言います。
奇妙な問題のように見えるものがあります。一部のビューでは、上部のツールバーを 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);
これをもたらします: