3

私はあなたがここで見ることができるような折り畳み式の Facebook メニューを作ろうとしています: http://www.mobileinc.co.uk/2012/05/folding-iphone-sidebar-menu/

今のところ、「折り」の部分に取り組んでいます。2 つのレイヤーがあります: - 左のレイヤーには {1,.5} にアンカー ポイントがあります - 右のレイヤーには {0,.5} にアンカー ポイントがあります

メインビューの真ん中で問題なく折りたたむことができます: CGFloat width = self.view.frame.size.width; CGFloat destinationWidth = slider.value * width;

CGFloat hypothenuse = self.view.frame.size.width/2.0f;
CGFloat adjacent = destinationWidth / 2.0f;
CGFloat opposite = sqrtf(powf(hypothenuse, 2)-powf(adjacent, 2));

CGFloat marginLeft = (width - destinationWidth) / 2;

CGFloat angle = asinf(opposite/hypothenuse);

CATransform3D transform = CATransform3DIdentity;
transform.m34 = 1.0f / -4000.0f;

rightSide.layer.transform = CATransform3DRotate(CATransform3DTranslate(transform,0,0,-opposite),-angle, 0, 1, 0);
leftSide.layer.transform = CATransform3DRotate(CATransform3DTranslate(transform,0,0,-opposite),angle, 0, 1, 0);

これは完全に機能します。次のように x 軸でレイヤーを変換しようとすると問題が発生します: CATransform3DTranslate(transform,-marginLeft,0,-opposite)

レイヤーは適切な z 移動で折り畳まれますが、ビュー全体が回転したかのようにぎこちない角度で終了します。

これは明らかにパースペクティブに関連しています(m34を設定しないと「機能します」)が、それを補正する方法がわかりません...

前もって感謝します!

乾杯、

TeuBeu2

4

1 に答える 1

0

次の順序で 4 つの変換を構成しています。

  1. 回転する
  2. Z を平行移動
  3. X を翻訳
  4. 計画

問題は、投影の前ではなく、投影の後に X を平行移動したいということです。そのままでは、突起で折り目を中心に向かって少し引き戻しています。これを試して:

CATransform3D transform = CATransform3DIdentity;
transform.m34 = 1.0f / -4000.0f;

transform = CATransform3DConcat(transform, CATransform3DMakeTranslation(-marginLeft,0,0));

rightSide.layer.transform = ...

免責事項:私は実際にこれをテストしていません

于 2012-06-08T00:30:06.020 に答える