2012-03-21 9 views
2

私は厳しい質問をしているようですが、ここで私は再び行きます。3D変換による網膜ディスプレイのコアグラフィック

私は奇妙な問題のように思えます。いくつかの私の見解では、x軸上に90度回転してツールバーを上に隠しています。私は、ビューを0度に回転させてツールバーを表示するユーザーによって「プルダウン」されることを許可します。 1つのビューで2つのツールバーをプルダウンする以外は、すべて素晴らしいです。これは、最初のツールバーを下に回転させ、2番目のツールバーを2番目のツールバーの高さだけ下に移動して機能します。このすべては、網膜以外のディスプレイでうまく動作します。しかし、網膜ディスプレイ上では、最初のツールバーの変位は、その半分にすぎません。さらに、ビューのフレームはまさにそれがすべきものです。つまり、私が(NSLog)をチェックすると、{0, 30, 320, 30}のフレームが得られますが、実際のイメージはフレームに表示されます:{0, 15, 320, 30}。それはシフトされた背景だけです。ビューが表示されるスペースをクリックすると、タッチイベントが表示されます。

これは、網膜の画面上で何が起こっているかである:

enter image description here

これは、非網膜画面(正確に同じコード)に何が起こるかです:

enter image description here

これはコード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でレンダリングされることにも注意した。

enter image description here

私はそれが変換と関係があると思いますが、どうやってその理由がわかりません。ローテーションが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); 

はこれを得られます。 enter image description here

答えて

1

私はそれを理解しました。私が苦労していたビューコントローラは、カスタムスプリットビューコントローラとして構築したカスタムコンテナコントローラにありました。そのコントローラは、ビューペインの切り替え時に3D変換も利用しました。トランジションの終わりに、私は.m34(遠近法変換)だけを残しました。どうやらこれは私が抱えていたすべての問題を引き起こしていたようだ。私は、コンテナコントローラでビューを切り替えるときに、レイヤの変換をアイデンティティに設定しましたが、今はすべて正常に動作します。

私は物語の道徳性は、サブレイヤーを変換する前にあなたのスーパーレイヤーが恒等変換されていることを常に確認するか、予期しない結果が生じることがあります。

0

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

+0

これは機能しませんでした.rasterizationScaleは、すでに網膜スクリーンにデフォルトで2に設定されていました。しかし、それは問題の一部であるように見えます。もし私がrasterizationScaleを強制的に1.0fにすると、ぼやけていることを除いて、drawRect/Core Graphicsですべて正常に動作します。 drawRect(通常のビューのみ)を使用しないと、rasterizationScaleはデフォルトで1に設定されます。手動で2に設定すると、上記の問題が発生します。 –

関連する問題