首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CATransform3D -理解转换值

CATransform3D -理解转换值
EN

Stack Overflow用户
提问于 2014-09-02 12:00:19
回答 3查看 1.2K关注 0票数 1

图中显示了应用以下转换后的简单UIView:

代码语言:javascript
复制
- (CATransform3D) transformForOpenedMenu
{
  CATransform3D transform = CATransform3DIdentity;
  transform.m34 = -1.0 /450;
  transform = CATransform3DRotate(transform, D2R(40), 0, 1, 0);
  transform = CATransform3DTranslate(transform, 210, 150, -500);
  return transform;
}

我试图使黑色突出显示的距离具有相等的长度。你能帮我理解数值和计算背后的逻辑吗?

干杯

UPD 9月13日

看起来,移除3DTranslate使距离保持相等。我看到我可以使用层的框架属性将旋转的视图重新定位到屏幕的左下角。还不确定,但这可能真的有效。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-01 10:44:56

好吧,最后解决了我的问题是:

  • Y轴上的三维变换使视图像门transform = CATransform3DRotate(transform, D2R(40), 0, 1, 0);一样摆动
  • 在层上设置Z锚点,将其移回targetView.layer.anchorPointZ = 850;
  • 调整图层位置,使视图稍微位于父视图的左下角: newPosition.x += 135 * positionDirection; newPosition.y += 70 * positionDirection;

这个序列可以在没有CATransform3DTranslate的情况下调整位置,并保持“摇摆”效果不失真。

谢谢大家!

票数 0
EN

Stack Overflow用户

发布于 2014-09-12 04:25:16

您设置的.m34值最好是在包含视图的sublayerTransform上设置,而不是在正在转换的视图上设置。

我不完全理解仿射变换背后的数学,所以我制作了这个项目,它允许我使用变换值来达到我想要的效果。您可以插入上面代码中的值,并查看它的外观,但请注意,已经有一个使用上面提到的sublayerTransform属性应用的透视图值。

对于您的具体情况,我认为您希望将该层的锚点调整为(0.00.5),并仅应用旋转转换。这假设你希望菜单像门一样向后摆动,铰链在左边边缘。

票数 2
EN

Stack Overflow用户

发布于 2014-09-12 21:02:03

您所看到的问题是由您的CATransform3DTranslate电话引起的。您实际上是将Y轴设置为偏离中心,从而看到了框架的不同透视图。

把它想成这样;

你站在一片狭长的田野中间,伸向地平线。该字段的边缘看起来就像它是收敛到一个中心点在远处的某个地方。如果你在场的中心,每个边到会聚点的角度就会出现相等。另一方面,如果你向左或向右移动,角度就会改变,其中一个看起来比另一个大(当然,相反)。

从本质上说,这就是您的视图所发生的事情;由于您的汇合点位于右侧,所以将Y轴从0改为0将与在上面的示例中向左或向右移动具有相同的效果。你不再看中间的平行线了。

因此,在上面的代码中,将CATransform3DTranslate中的ty设置为0应该可以解决您的问题,即。

代码语言:javascript
复制
   transform = CATransform3DTranslate(transform, 210, 0, -500);

您还可能需要更改tz和tx值以使其适合。

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

https://stackoverflow.com/questions/25622909

复制
相关文章

相似问题

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