这一直让我发疯。我正在使用 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 有一个兄弟图像视图,在动画期间用作背景。