我正在尝试制作折叠的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(变换,-marginLeft,0,-opposite)
图层仍然会以良好的z平移折叠,但它以一个尴尬的角度结束,就像整个视图已经旋转一样。
这显然与视角有关(当我没有设置m34时,它“有效”)但我无法想象如何补偿它......
提前谢谢!
干杯,
TeuBeu2
答案 0 :(得分:0)
您按顺序编写了4个变换:
问题是你想在投影后进行翻译X,而不是之前。实际上,你用投影将折叠向中心拉回一点。试试这个:
CATransform3D transform = CATransform3DIdentity;
transform.m34 = 1.0f / -4000.0f;
transform = CATransform3DConcat(transform, CATransform3DMakeTranslation(-marginLeft,0,0));
rightSide.layer.transform = ...
免责声明:我实际上没有测试过这个