【问题标题】:CATransform3D transformCATransform3D 变换
【发布时间】:2012-04-14 08:52:52
【问题描述】:

我正在尝试使用 CATransform3D 向视图添加透视图。目前,这就是我得到的:

这就是我想要的:

我很难做到这一点。我完全迷失在这里。这是我的代码:

CATransform3D t = CATransform3DIdentity;
    t.m11 = 0.8;
    t.m21 = 0.1; 
    t.m31 = -0.1; 
    t.m41 = 0.1;
    [[viewWindow layer] setTransform:t];

【问题讨论】:

    标签: iphone ios uiview core-animation transform


    【解决方案1】:

    矩阵元素 .m34 负责透视。文档中没有太多讨论,所以你必须玩弄它。这个答案稍微谈谈如何使用它:https://stackoverflow.com/a/7596326/1228525

    要真正看到该矩阵的效果,您需要做两件事: 1. 将该透视矩阵应用于父视图的子层变换 2. 旋转子视图(您想要透视的那个) - 否则它将保持平坦,您将无法判断它现在具有 3D 透视。

    数字是任意的,让它们看起来最好:

    CATransform3D t = CATransform3DIdentity;
    t.m34 = .005;
    parentView.layer.sublayerTransform. = t;
    childview.layer.transform = CATransform3DMakeRotation(45,1,0,0); 
    

    根据子视图在父视图中的位置,透视图看起来会有所不同。如果孩子位于父母的中心,就像您直接以 3D 方式查看孩子视图一样。距离中心越远,您从掠过的角度观看的效果就越好。

    这是我使用上面的代码并将子视图居中得到的:(显然我是新手,所以不允许发布图片,所以你必须看到链接)http://i.stack.imgur.com/BiYCS.png

    根据这些图片很难判断您的目标是什么;如果我的答案不是您想要的,多一点解释可能会有所帮助。从图片中我可以看出,底部不是透视图......

    【讨论】:

    • 你的意思是CATransfrom3DMakeRotation(45/180*2*3.1416, 1, 0, 0)?第一个参数的值应该是弧度。
    • 不。正如我所说,这些数字是任意的,随心所欲。
    【解决方案2】:

    我能够使用AGGeometryKit 轻松实现正确的 CATransform3D。

    #import <AGGeometryKit/AGGeometryKit.h>
    
    UIView *view = ...; // create a view
    
    // setting anchorPoint to zero
    view.layer.anchorPoint = CGPointZero;
    view.layer.transform = CATransform3DMakeTranslation(-view.layer.bounds.size.width * .5, -view.layer.bounds.size.height * .5, 0);
    
    // setting a trapezoid transform
    AGKQuad quad = view.layer.quadrilateral;
    quad.tl.x -= 10; // shift top left x-value with 10 pixels
    view.layer.quadrilateral = quad; // the quad is converted to CATransform3D and applied
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      • 2012-08-23
      • 1970-01-01
      • 1970-01-01
      • 2014-08-13
      • 1970-01-01
      相关资源
      最近更新 更多