Это сбило меня с ума. Я использую s CATransform3D
, чтобы анимировать основной слой моего представления (применить эффект перспективы). У меня есть функция, называемая ApplyPerspective
, которая устанавливает ее, и ClearPerspective
, которая сбрасывает свойство преобразования слоя на CATransform3DIdentity
.CALayer transform при анимации
Вот мой код:
ApplyPerspective(self.mainContentView);
[UIView animateWithDuration:self.animationDuration
delay:0.0
options:UIViewAnimationOptionCurveEaseOut
animations:^{
ClearPerspective(self.mainContentView);
}
completion:nil];
Проблема, которую я имею, что перспективное преобразование применяется ApplyPerspective
неверен. Если я удалю вызов - animateWithDuration
, но оставьте вызов ApplyPerspective
, слой будет отображаться как ожидалось. Я не уверен, почему поведение меняется при анимации.
Я попытался изменить продолжительность, кривую анимации, сгладить вызовы функций, но я не могу отследить источник этой ошибки.
Update, чтобы добавить тела 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 имеет вид изображения сестры, который используется в качестве фона во время анимации.
Вам необходимо предоставить еще один код, который показывает контекст вашего вопроса. Покажите нам, как вы настраиваете свою перспективу, а также то, что делает ваша функция ClearPerspective. –
Достаточно честный, я обновил и включил тела функций. – TimMcL
Я боролся с этим в последний месяц. У меня больше подсказок, но не ближе к решению. Проблема связана с атрибутом m34. Если я оставлю его в покое (никогда не придавая ему значения), то анимация начинается, как ожидалось (конечно, не хватает желаемой перспективы). Кажется, что параметр m34 вызывает смещение представления, но я не могу понять, почему это будет сделано. – TimMcL