首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CATransform3DRotate后CATransform3DTranslate

CATransform3DRotate后CATransform3DTranslate
EN

Stack Overflow用户
提问于 2012-06-07 14:11:15
回答 1查看 2.4K关注 0票数 3

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

现在,我只是在做“折叠”部分的工作。我有两个层:-左层有一个锚点在{1,.5} -右层有一个锚点在{0,.5}

我可以使它们在我的主要视图中间折叠,而不会出现这样的问题: CGFloat like = self.view.frame.size.width;CGFloat destinationWidth = slider.value *like;

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2012-06-08 00:30:06

您将按以下顺序组成4个转换:

  1. Rotate
  2. Translate Z
  3. 翻译X
  4. Project

问题是,你想要在投影之后,而不是之前翻译X。实际上,你用投影把褶皱拉回中央一点。试试这个:

代码语言:javascript
复制
CATransform3D transform = CATransform3DIdentity;
transform.m34 = 1.0f / -4000.0f;

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

rightSide.layer.transform = ...

免责声明:我还没有真正测试过这个

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10933569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档