Мне удалось заставить код работать в немного другом формате.
CATransform3D flip = CATransform3DMakeRotation(M_PI, 1.0, 0.0, 0.0);
if (CATransform3DEqualToTransform(window.layer.transform, flip))
{
flip = CATransform3DMakeRotation(M_PI, 0.0, 0.0, 0.0);
}
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:1.0];
window.layer.transform = flip;
[UIView commitAnimations];
Из того, что я могу сказать, всякий раз, когда он получал команду поворота, он рассматривал окно только в своем первоначальном состоянии. Это означало, что каждая новая команда переворачивалась, она видела, что уже находилась в запрошенной позиции, и ничего не делала. Как только я понял это, мне просто нужно было дать команду вернуть его в нормальное состояние. Для меня до сих пор загадка, почему код в моем вопросе работал для оси Y, а не для X.