这让我发疯。我正在使用 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/