2013-09-26 4 views
2

Это сбило меня с ума. Я использую 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 имеет вид изображения сестры, который используется в качестве фона во время анимации.

+0

Вам необходимо предоставить еще один код, который показывает контекст вашего вопроса. Покажите нам, как вы настраиваете свою перспективу, а также то, что делает ваша функция ClearPerspective. –

+0

Достаточно честный, я обновил и включил тела функций. – TimMcL

+0

Я боролся с этим в последний месяц. У меня больше подсказок, но не ближе к решению. Проблема связана с атрибутом m34. Если я оставлю его в покое (никогда не придавая ему значения), то анимация начинается, как ожидалось (конечно, не хватает желаемой перспективы). Кажется, что параметр m34 вызывает смещение представления, но я не могу понять, почему это будет сделано. – TimMcL

ответ

2

Я, наконец, решил! По-видимому, некоторые преобразования могут влиять на автоматическую компоновку, и кадр mainContentView был изменен механизмом компоновки, хотя преобразование было сбрасывается на преобразование идентичности.

Исправление состоит в том, чтобы отправить -layoutIfNeeded в родительский вид (self.view в моем случае), чтобы заставить макет, и снова после завершения анимации. Я отправляю это, так как другие могут сталкиваться с чем-то похожим.

Если ваше преобразование не выглядит правильно, отправьте -layoutIfNeeded.

Смежные вопросы