【问题标题】:CATransform3DRotate after CATransform3DTranslateCATransform3DTranslate 之后的 CATransform3DRotate
【发布时间】:2012-06-07 14:11:15
【问题描述】:

我正在尝试制作一个折叠式 facebook 菜单,就像您在此处看到的那样:http://www.mobileinc.co.uk/2012/05/folding-iphone-sidebar-menu/

目前,我正在研究“折叠”部分。我有 2 层: - 左层在 {1,.5} 有一个锚点 - 右侧图层在 {0,.5}

处有一个锚点

我可以让它们在我的主视图中间折叠而不会出现这样的问题: CGFloat 宽度 = 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

【问题讨论】:

  • 我知道这与消失点有关,但我无法更改它。我尝试修改主视图锚点,但似乎不起作用...
  • 对z翻译使用-opposite有什么作用?

标签: iphone objective-c 3d catransform3d catransformlayer


【解决方案1】:

您正在按以下顺序编写 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 = ...

免责声明:我还没有实际测试过这个

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    相关资源
    最近更新 更多