Проблема заключается в том, что вращение вокруг оси Y в настоящей 3D-системе композитинга заставит слой A пересекаться со слоем B, так что половина слоя A должна быть видимой, а половина должна быть позади слоя B. CoreAnimation не обеспечиваетнастоящая система 3D композитинга.Вместо этого он пытается определить, какой слой находится перед каким другим слоем, и отображает его полностью без пересечения.В вашем случае во время первой половины ротации CoreAnimation приняла решение, что слой B находится поверх слоя A в трехмерном пространстве.Самое простое решение, вероятно, состоит в том, чтобы установить zPosition слоя A на layer.bounds.size.width
(по умолчанию 0) на время анимации (или постоянно, если оно всегда должно быть сверху).
Если вы хотитеустановите его только на время анимации, вы можете добавить вторую анимацию для ключевого пути transform.translation.z
.Вот ваш -flip
метод, модифицированный для использования этого:
- (IBAction)flip:(id)sender {
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.y"];
CGFloat startValue = 0.0;
CGFloat endValue = M_PI;
animation.fromValue = [NSNumber numberWithDouble:startValue];
animation.toValue = [NSNumber numberWithDouble:endValue];
animation.duration = 5.0;
[imageOne.layer addAnimation:animation forKey:@"rotate"];
animation.keyPath = @"transform.translation.z";
animation.fromValue = [NSNumber numberWithFloat:imageOne.layer.bounds.size.width];
animation.toValue = animation.fromValue;
[imageOne.layer addAnimation:animation forKey:@"zPosition"];
}