Решение Ноя - самый чистый способ сделать то, что вы хотите, но причина, по которой вы не видите анимацию, заключается в том, что неявные анимации отключены для CALayers, которые поддерживают UIViews.Поскольку ничто не анимирует, CATransaction не может установить продолжительность для чего-либо.
Если вы действительно хотите выполнить эту анимацию на слое, вам нужно настроить CABasicAnimation вручную, чтобы сделать это:
CABasicAnimation *opacityAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
opacityAnimation.removedOnCompletion = NO;
opacityAnimation.fillMode = kCAFillModeForwards;
[oldLayer addAnimation:opacityAnimation forKey:@"opacity"];
[newLayer addAnimation:opacityAnimation forKey:@"opacity"];
[CATransaction begin];
[CATransaction setAnimationDuration:1.0f];
oldLayer.opacity = 0.0;
newLayer.opacity = 1.0;
[CATransaction commit];
(Обратите внимание, что я не уверен, что вы можете повторно использовать анимацию непрозрачности здесь. Возможно, вам придется создавать отдельные экземпляры для каждого слоя.)