为什么使用CATransform3D进行这种转换会减少视图的宽度?

max*_*son 5 cocoa-touch core-animation objective-c catransform3d ios

看看下面的图像进展:

在此输入图像描述 在此输入图像描述 在此输入图像描述

这里发生的事情首先是我选择了"棒球",导致你看到的3个灰色视图向左旋转,以便具有不同级别的那个位于中间(第二个图像).您可以看到,此时视图的宽度已经大幅减少.单击包含运动名称的视图后,会出现第三个图像,使其旋转回中间.

据我所知,当视图旋转到中间时,视图的宽度会减小.但我不明白为什么.

这是相关的代码.pos是指有view问题的地方.0表示它在中间,1表示它是中间的右边-1一个,是中间左边的一个,等等.

- (void)perspectiveView:(MenuSection *)view forPosition:(NSInteger)pos
{

    CALayer *layer = view.layer;
    CATransform3D transform = CATransform3DIdentity;

    MenuSection *prevView = (pos >= 0) ? (MenuSection *)[self viewWithTag:view.tag - 1] : (MenuSection *)[self viewWithTag:view.tag + 1];

    if (pos == 0) {
        view.changingToFrame = CGRectMake(round((480 - view.frame.size.width)/2), view.frame.origin.y, view.frame.size.width, view.frame.size.height);
        view.frame = view.changingToFrame;

    } else {

        if (pos == 1) {
            NSLog(@"%@",NSStringFromCGRect(prevView.changingToFrame));
            view.changingToFrame = CGRectMake(round(prevView.changingToFrame.origin.x + prevView.frame.size.width + 20), view.frame.origin.y, view.frame.size.width, view.frame.size.height);
            transform.m34 = 1.0 / 1000;
        } else if (pos == -1){
            view.changingToFrame = CGRectMake(round(prevView.changingToFrame.origin.x - view.frame.size.width - 20), view.frame.origin.y, view.frame.size.width, view.frame.size.height);
            transform.m34 = 1.0 / -1000;
        } else if (pos == 2){
            view.changingToFrame = CGRectMake(round(prevView.changingToFrame.origin.x + prevView.frame.size.width + 20), view.frame.origin.y, view.frame.size.width, view.frame.size.height);
            transform.m34 = 1.0 / 500;
        } else if (pos == -2){
            view.changingToFrame = CGRectMake(round(prevView.changingToFrame.origin.x - view.frame.size.width - 20), view.frame.origin.y, view.frame.size.width, view.frame.size.height);
            transform.m34 = 1.0 / -500;
        }

        view.frame = view.changingToFrame;

        transform = CATransform3DRotate(transform, 45.0f * M_PI / 180.0f, 0.0f, 1.0f, 0.0f);
    }

    layer.transform = transform;
}
Run Code Online (Sandbox Code Playgroud)

max*_*son 7

我已经解决了.事实证明,应用CATransform3D实际上会改变视图的框架.在我贴,当我设置视图的新帧(因为它旋转到不同的位置)的代码,我简单地使用view.frame.size.widthCGRectMake()以试图维持宽度.但是,由于CATransform3D之前已经修改了宽度,我没有得到我想要的实际宽度.

解决方案是将必要的子类化UIViews并将其原始帧存储在ivar中.这样,在将视图移动到不同位置时,我总是可以将其用作参考点.

  • +1用于努力写下解决方案 (2认同)