ios - 动画时 CALayer 变换不同

标签 ios objective-c animation calayer uiviewanimation

这让我发疯。我正在使用 CATransform3D 来为 View 的主层设置动画(以应用透视效果)。我有一个名为 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;
}

这是 View 层次结构:mainContentView 是 ViewController Root View 的 subview ,它使用自动布局。约束条件是 mainContentView 填充 Root View 。 mainContentView 有一个同级 ImageView ,在动画期间用作背景。

最佳答案

我终于解决了!显然,某些转换会影响自动布局,并且布局引擎正在修改 mainContentView 的框架,即使转换已重置为身份转换。

修复方法是将 -layoutIfNeeded 发送到父 View (在我的例子中为 self.view)以强制布局,并在动画完成后再次发送。我发布此内容是因为其他人可能会遇到类似的情况。

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

关于ios - 动画时 CALayer 变换不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19018503/

相关文章:

iphone - 绘图粒子

ios - 哪些 OSX 图像格式与 IOS 兼容

Javascript - Buggy SlideToggle 效果(无 jQuery)

iphone - UIView 动画交互不良

android - 摇摇欲坠的谷歌地图标记动画

ios - 选择 estimatedHeight 与 rowHeight 不同的项目时,iOS8 中的 UITableView 错误

iphone - UIViewControllers ...使用 subview 进行内存管理

ios - 如何使用 XCode 6 在 iOS 7 的 UItableviewCell 中制作 UIlabel 的动态高度

iOS 11 双击图像会关闭 UIImagePickerController 和演示者 View Controller

ios - AVPlayer 隐藏式字幕打开/关闭