2

这一直让我发疯。我正在使用 sCATransform3D为视图的主层设置动画(以应用透视效果)。我有一个名为的函数ApplyPerspective来设置它,并将ClearPerspective图层的变换属性重置为CATransform3DIdentity.

这是我的代码:

    ApplyPerspective(self.mainContentView);

    [UIView animateWithDuration:self.animationDuration
                          delay:0.0
                        options:UIViewAnimationOptionCurveEaseOut
                     animations:^{
                         ClearPerspective(self.mainContentView);
                    }
                     completion:nil];

我遇到的问题是应用的透视变换ApplyPerspective不正确。如果我删除了 -animateWithDuration呼叫,但离开了ApplyPerspective呼叫,则该图层将按预期呈现。我不确定为什么动画时行为会发生变化。

我试过改变持续时间、动画曲线、拉平函数调用,但我无法追踪这个错误的根源。

更新以添加 ApplyPerspective() 和 ClearPerspective() 的主体:

void ApplyPerspective(UIView *aView) {

    // Magic numbers derived using debug sliders
    CGFloat zDist, rotRads, xOffset, yOffset, scale, shift;
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        zDist   = 172.5378;
        rotRads = 2.6531;
        xOffset = -13.0;
        yOffset = 402;
        shift   = -241;

    }
    else {
        zDist =     513.4995;
        rotRads =   1.0007;
        xOffset = 0.0;
        yOffset =   -100.0;
        scale = 1.0;
        shift = 0.0;
    }

    CATransform3D p = CATransform3DIdentity;

    p = CATransform3DTranslate(p, xOffset, yOffset, 0.0);

    p.m34 = 1.0 / -zDist;
    p = CATransform3DRotate(p, rotRads, 1.0, 0.0, 0);

    p = CATransform3DTranslate(p, 0, shift, 0.0);

    aView.layer.transform = p;
}

void ClearPerspective(UIView *aView, UIView *parentView) {
    aView.layer.transform = CATransform3DIdentity;
}

这是视图层次结构: mainContentView 是 ViewController 根视图的子视图,它使用自动布局。约束使得 mainContentView 填充根视图。mainContentView 有一个兄弟图像视图,在动画期间用作背景。

4

1 回答 1

2

我终于解决了!显然,一些变换会影响自动布局,并且mainContentView布局引擎正在修改框架,即使变换被重置为标识变换。

修复方法是发送-layoutIfNeeded到父视图(self.view在我的情况下)以强制布局,并在动画完成后再次发送。我发布这个是因为其他人可能会遇到类似的事情。

如果您的转换看起来不正确,请发送-layoutIfNeeded.

于 2013-10-31T06:31:28.093 回答