私は厳しい質問をしているようですが、ここで私は再び行きます。3D変換による網膜ディスプレイのコアグラフィック
私は奇妙な問題のように思えます。いくつかの私の見解では、x軸上に90度回転してツールバーを上に隠しています。私は、ビューを0度に回転させてツールバーを表示するユーザーによって「プルダウン」されることを許可します。 1つのビューで2つのツールバーをプルダウンする以外は、すべて素晴らしいです。これは、最初のツールバーを下に回転させ、2番目のツールバーを2番目のツールバーの高さだけ下に移動して機能します。このすべては、網膜以外のディスプレイでうまく動作します。しかし、網膜ディスプレイ上では、最初のツールバーの変位は、その半分にすぎません。さらに、ビューのフレームはまさにそれがすべきものです。つまり、私が(NSLog)をチェックすると、{0, 30, 320, 30}
のフレームが得られますが、実際のイメージはフレームに表示されます:{0, 15, 320, 30}
。それはシフトされた背景だけです。ビューが表示されるスペースをクリックすると、タッチイベントが表示されます。
これは、網膜の画面上で何が起こっているかである:
これは、非網膜画面(正確に同じコード)に何が起こるかです:
これはコードIでありますビューを回転するために使用します(非常に簡単です):
- (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;
}
再び、これは網膜ディスプレイでのみ発生します。
今、ツールバーはCore Graphicsでレンダリングされています。だから、drawRectから完全に取り除くことで問題の原因となったCGコードを削除し、draw rectにコードが全くないようにしました。それでも問題は発生します。私はdrawRect(メソッド全体をコメントアウトする)を使用しないと回転が正しく行われるが、すべてのサブビュー(コアグラフィックも使用する)はすべてがぼやけて見えるように解像度の1/2でレンダリングされることにも注意した。
私はそれが変換と関係があると思いますが、どうやってその理由がわかりません。ローテーションが0ラジアンに設定された後にレイヤートランスフォームをIDに設定すると(完全に表示されているため)、ビューは正しい位置にスナップされます。私はまた、0ラジアンでは、変換が全く同一ではないことに留意しました。m34(パースペクティブ)はまだ設定されています。ゼロに戻すと問題が解決されます。しかし、0に設定すると、ビューが0 rad以外の回転中に問題は解決されません。また、原点{0,0}から回転していないビューも移動します。どの3D変換でも問題が発生したようですが、すべての変換を確認して確認しています。
UPDATE
ため、私は層のrasterizationScaleいじり始め@Joshua Weinberg氏による答えに。私が発見したのは、基になるイメージのオフセットが1/rasterizationScaleによって外れていたことでした。したがって、rasterizationScaleを6に設定してビューを30だけ動かすと、背景イメージは30/6(5.0f)だけ下に移動します。
UPDATE 2
I画像をダウン翻訳することにより、私はハックを試みました。これは、画像が適切な量だけ下に移動するだけでなく、画像も消えるように機能します。だから私のローテーション方式でこのコード:
rT = CATransform3DTranslate(rT, view.frame.origin.x - (view.frame.origin.x/rLayer.rasterizationScale), view.frame.origin.y - (view.frame.origin.y/rLayer.rasterizationScale), 0);
はこれを得られます。
これは機能しませんでした.rasterizationScaleは、すでに網膜スクリーンにデフォルトで2に設定されていました。しかし、それは問題の一部であるように見えます。もし私がrasterizationScaleを強制的に1.0fにすると、ぼやけていることを除いて、drawRect/Core Graphicsですべて正常に動作します。 drawRect(通常のビューのみ)を使用しないと、rasterizationScaleはデフォルトで1に設定されます。手動で2に設定すると、上記の問題が発生します。 –