Примените преобразование к самому UIView

Я пытаюсь применить перспективное преобразование к моему объекту UIView с помощью следующего кода:

CATransform3D t = CATransform3DIdentity;
t.m34 = -1.0/1000;
t = CATransform3DRotate(t, angle, 0.0f, 1.0f, 0.0f);

myView.layer.transform = t;

и я не вижу вообще никакого эффекта. Я пробовал другие преобразования, такие как простой перевод, и они тоже не работают.

Однако, если я сделаю одну из следующих двух модификаций, она будет работать в некоторой степени, но ни одна из них не удовлетворит мой запрос:

  1. Измените последнюю строку на

    myView.layer.sublayerTransform = t;

Такой вид работает, но он преобразует только подпредставления в myView, а не сам myView.

  1. Добавьте код анимации, чтобы применить изменение вместо того, чтобы напрямую назначать изменение слою:

    CABasicAnimation * TurnAnimation = [CABasicAnimation animationWithKeyPath: @ "преобразование"]; TurnAnimation.toValue = [NSValue valueWithCATransform3D: t]; TurnAnimation.delegate = self; TurnAnimation.fillMode = kCAFillModeForwards; TurnAnimation.removedOnCompletion = НЕТ;

    [myView.layer addAnimation: TurnAnimation forKey: @ "поворота"];

Дело в том, что мне не нужна анимация.

Кто-нибудь может указать мне направление?

Спасибо!


person CodeBrew    schedule 18.09.2013    source источник
comment
Какой угол вы предоставили?   -  person Krishnan    schedule 18.09.2013
comment
Это произвольный угол, например 45.0f * M_PI / 180.0   -  person CodeBrew    schedule 18.09.2013
comment
У меня это работает с любым произвольным углом ...   -  person Krishnan    schedule 19.09.2013
comment
Просто хотите убедиться, что вы использовали myView.layer.transform вместо myView.layer.sublayerTransform, и вы не использовали анимацию?   -  person CodeBrew    schedule 19.09.2013
comment
Я не использовал анимацию и установил преобразование в слой представления, а не подслои.   -  person Krishnan    schedule 19.09.2013
comment
Я запустил пустой проект, добавил минимум кода и протестировал приведенное выше преобразование, и оно действительно работает. Так что я думаю, что в моем (исходном) проекте должно быть что-то еще, что мешало повороту обзора. Мне придется покопаться в этом, чтобы узнать. Спасибо за терпеливое тестирование и ответ!   -  person CodeBrew    schedule 19.09.2013
comment
Я разобрался в проблеме. Это связано с тем, что у моего слоя представления есть предыдущая анимация, у которой toValue равно значению преобразования идентичности, а значение removeOnCompletion равно NO, что предотвращает работу последующего неанимированного преобразования. Еще раз спасибо, ваш тест подтвердил мне, что преобразование на уровне само по себе работает, поэтому я мог сосредоточиться на проверке других частей кода.   -  person CodeBrew    schedule 19.09.2013
comment
добро пожаловать, CodePlumber .. Добавьте это как ответ и отметьте ответом ..   -  person Krishnan    schedule 20.09.2013
comment
Сделал, как вы предложили. Еще раз спасибо!   -  person CodeBrew    schedule 20.09.2013


Ответы (2)


Вы должны иметь возможность просто использовать myView.transform = CGAffineTransformMakeRotation (angle). Он не будет анимировать свойство, если вы явно не укажете ему использование [UIView animateWithDuration:]. Использование свойства преобразования UIView в конечном итоге применит ваше преобразование к CALayer, который поддерживает UIView, поэтому я бы обязательно взаимодействовал с преобразованиями только на одном уровне (UIView или CALayer).

Документ преобразования UIView: https://developer.apple.com/library/ios/documentation/uikit/reference/uiview_class/UIView/UIView.html#//apple_ref/occ/instp/UIView/transform

Документ CGAffineTransform:

https://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CGAffineTransform/Reference/reference.html#//apple_ref/c/func/CGAffineTransformMakeRotation

person sashimiblade    schedule 18.09.2013
comment
Спасибо за ответ, но CGAffineTransform предназначен только для линейного 2D-преобразования. Мне нужны трехмерные проекции, такие как перспективное преобразование, которое я задал в вопросе. - person CodeBrew; 18.09.2013

Я выяснил проблему после того, как тест Кришнана подтвердил, что сам layer.transform работает без помощи анимации или sublayerTransform. Проблема, с которой я столкнулся, была вызвана анимацией, которая была применена к слою моего представления и впоследствии не была удалена. Поскольку эта анимация имела toValue, равное преобразованию идентичности, я не понимал, что это может помешать работе последующих неанимированных преобразований. Установка в анимации removeOnCompletion = YES (по умолчанию) решила загадку.

person CodeBrew    schedule 20.09.2013