Я использую этот код внутри подкласса CALayer, экземпляры которого являются подслоями корневого CALayer.
-(void)setSelected:(bool)s {
selected=s;
if (s)
{
CATransform3D rot = CATransform3DMakeRotation(M_PI, 0, 1, 0);
rot.m34=-1.0 / 200;
[self setTransform:rot];
}
else
{
CATransform3D rot = CATransform3DMakeRotation(0, 0, 1, 0);
rot.m34=-1.0 / 200;
[self setTransform:rot];
}
}
Когда для выбранного свойства установлено значение TRUE, происходит вот что: поворот выполняется до тех пор, пока угол не станет равным M_PI/2, затем слой исчезает, поскольку он ортогонален. Конец анимации неправильный: край, который, казалось, рос в первой части анимации (например, с левой стороны), заканчивает анимацию с левой стороны, а не с правой. Однако содержимое перевернуто.
Я думаю, что это как-то связано с интерполяцией между двумя матрицами вращения, но я не могу точно понять, что происходит.
Детали: анимация выглядит следующим образом:
- увеличить вращение вокруг оси Y на +Pi/2
- перелистывание контента
- увеличить вращение вокруг оси Y на -Pi/2, как если бы он отскочил от плоскости (yz)
Перевернутый контент - это то, чего я пытаюсь достичь.
Вот кадры анимации, которые я получаю. Как видите, меньшая сторона трапеции всегда слева; он должен быть справа в конце анимации (верхний правый кадр).