Эффекты CATransform3DRRotate исчезли после применения опорной точки

РЕДАКТИРОВАТЬ с правильным наблюдением.

Я использовал следующие два фрагмента для поворота UIImageView. После этапа1 я получил желаемый 3D-эффект: вид вращается (3D-эффект) и растягивается (больше размер). На этапе 2 я пытаюсь качнуть правый вид с шарниром справа.

Если бы я применил линию, которая изменяет точку привязки, вид качается правильно (шарнир справа) с одной серьезной проблемой: размер вида восстанавливается до исходного размера (меньше), в то время как 3D-эффект (вращение) все еще не поврежден, а затем происходит раскачивание.

Какие-либо предложения?

rightView.layer.anchorPoint = CGPointMake(1.0, 0.5); 


-(void)stage1
{
    [UIView animateWithDuration:1.5  animations:^{
        rightView.transform = CGAffineTransformMakeTranslation(0,0);   //rightView i UIImageView
        CATransform3D _3Dt = CATransform3DIdentity;
        _3Dt =CATransform3DMakeRotation(3.141f/42.0f,0.0f,-1.0f,0.0f);  
        _3Dt.m34 = -0.001f;
        _3Dt.m14 = -0.0015f;
        rightView.layer.transform = _3Dt;
    } completion:^(BOOL finished){
        if (finished) {
            NSLog(@"finished..");
        }
    }];
}

-(void)Stage2
{
    rightView.layer.anchorPoint = CGPointMake(1.0, 0.5);   //issue?
    rightView.center = CGPointMake(1012, 384);
    [UIView animateWithDuration:1.75 animations:^{
        CATransform3D rightTransform = rightView.layer.transform;
        rightTransform.m34 = 1.0f/500; 
        rightTransform = CATransform3DRotate(rightTransform, M_PI_2, 0, 1, 0);
        rightView.layer.transform = rightTransform;
    } completion:^(BOOL finished) {
    }];
}

person user523234    schedule 04.06.2013    source источник
comment
Изменение точки привязки также меняет способ применения преобразования. Не могли бы вы создать изображение желаемых результатов, например. Фотошоп? Исходное состояние, состояние завершения анимации stage1, состояние завершения анимации stage2?   -  person hfossli    schedule 05.06.2013
comment
@hfossli, фотографии добавлены. Я также добавил изображение прямо перед анимацией stage2. Обратите внимание: я могу использовать setFrame для изменения кадра rightView перед анимацией stage2, но я не могу заставить его соответствовать исходному 3D-эффекту (угол и т. д.) после анимации stage1.   -  person user523234    schedule 05.06.2013
comment
Являются ли изображения, которые вы загрузили, желаемым результатом или неправильным результатом?   -  person hfossli    schedule 05.06.2013
comment
@hfossli, это было неправильно. Изображение 4 было результатом анимированного изображения 3, а не изображения 2. Изображение 3. Как вы можете видеть, настройка anchorPoint изменила размер изображения 2.   -  person user523234    schedule 05.06.2013
comment
Что произойдет, если вы не укажете значение rightView.center = CGPointMake(1012, 384); ? Или поставить его вместе с анимацией? Я думаю, что это заставит вид прыгать до того, как начнется вторая анимация.   -  person HalR    schedule 06.06.2013
comment
В целях отладки оставьте часть об углах. Размер еще меняется? Другой вопрос: уверены ли вы, что код этапа 2 не инициируется до выполнения этапа 1?   -  person hfossli    schedule 06.06.2013
comment
@hfossli, не уверен, что ты имел в виду, говоря об отсутствии углов? Да, стадия 1 предшествует стадии 2. Кроме того, если я удалю линию установки точки привязки (и центральную движущуюся линию), изображение2 сохранит текущий размер и трехмерную перспективу. Но он будет качаться с петлей слева.   -  person user523234    schedule 07.06.2013
comment
@HalR, оставление центральной линии не имело бы никакого значения. Ложь установки якоря является причиной уменьшения представления.   -  person user523234    schedule 07.06.2013


Ответы (1)


Вам нужно добавить «опции» к вашей анимации с продолжительностью и добавить options:UIViewAnimationOptionBeginFromCurrentState

В противном случае все начинается сначала.

Итак, ваш этап 2 будет выглядеть так:

-(void)Stage2
{
    rightView.layer.anchorPoint = CGPointMake(1.0, 0.5);   //issue?
    rightView.center = CGPointMake(1012, 384);
    [UIView animateWithDuration:1.75
                          delay:0.00 
                        options:UIViewAnimationOptionBeginFromCurrentState
                     animations:^{
        CATransform3D rightTransform = rightView.layer.transform;
        rightTransform.m34 = 1.0f/500; 
        rightTransform = CATransform3DRotate(rightTransform, M_PI_2, 0, 1, 0);
        rightView.layer.transform = rightTransform;
    } completion:^(BOOL finished) {
    }];
}
person HalR    schedule 04.06.2013
comment
Я пробовал, но это дало тот же результат. Как и в моем исходном фрагменте, если я не устанавливал anchorPoint, исходный эффект преобразования не менялся. Якорь, кажется, виновником. Любые другие предложения? - person user523234; 04.06.2013
comment
Мое первоначальное наблюдение было неверным. Пожалуйста, смотрите обновление, если вы все еще заинтересованы. Спасибо. - person user523234; 04.06.2013
comment
В моем случае это слой. Любое свойство, чтобы установить CABasicAnimation для запуска с текущего состояния слоя? - person nr5; 19.10.2014