CATransform3D – 了解变换值
下图显示了应用以下转换后的一个简单的UIView:
- (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保持距离相等。 我看到我可以使用图层的框架属性重新定位到屏幕左下angular的旋转视图。 还不确定,但这可能实际上工作。
您正在设置的.m34值最好在包含视图的sublayerTransform上设置,而不是您正在转换的视图。
我不完全理解仿射变换后面的math,所以我做了这个项目 , 这个项目允许我用变换值来实现我想要的效果。 您可以插入上面的代码中的值,看看它的样子,但请注意,已经使用上面提到的sublayerTransform属性应用了透视图值。
对于你的具体情况,我想你想调整图层的锚点为(0.0,0.5),并只应用旋转变换。 这假设你想让菜单像门一样摆动,铰链在左边。
您看到的问题是由您的CATransform3DTranslate调用引起的。 你本质上是将Y轴设置为偏离中心,因此看到了框架的不同透视图。
这样想,
你站在一个狭长的田野中央,伸向地平线。 场的边缘看起来好像收敛到远处的某个中心点。 如果你在场地的中心,每个边缘与会聚点的angular度将是相等的。 另一方面,如果你向左或向右移动,则angular度会改变,而其中一个看起来比另一个(当然是相反的)更大。
这基本上就是你的观点所发生的事情; 当你的收敛点在右边时,将Y轴从0改变成与在上面的例子中向左或向右移动的效果相同。 你不再看中心的平行线。
所以在上面的代码中将CATransform3DTranslate中的ty设置为0应该修复您的问题IE
transform = CATransform3DTranslate(transform, 210, 0, -500);
您可能还需要更改tz和tx值以使其适合。
好的,所以最终解决了我的问题是:
- 在Y轴上进行3D变换,使得视图像门
transform = CATransform3DRotate(transform, D2R(40), 0, 1, 0);
- 在图层上设置Z锚点,将其移回
targetView.layer.anchorPointZ = 850;
-
调整图层的位置,使视图位于父视图的左下angular稍微处:
newPosition.x += 135 * positionDirection; newPosition.y += 70 * positionDirection;
这个序列在没有CATransform3DTranslate
情况下调整位置,并保持“swinged”效果不失真。
谢谢大家!
- 如何在需要时停止UIViewanimation?
- pushviewcontrolleranimation没有实际调用pushviewcontroller
- animationUIButton的标题更改
- 如何完全使用animationWithDuration和transitionWithView
- 将自定义animation添加到popToRootViewController
- IOS – 多个图像缓慢向上的animation
- 如何模仿iOS 7上的键盘animation,将“完成”button添加到数字键盘?
- 将imageNamed转换为imageWithContentsOfFile:
- 使用animation隐藏和显示滚动视图