Я пытаюсь перейти с одного взгляда на другой. Я знаю, что есть «[UIView transitionWithView ...», но я собираюсь добавить более сложные вещи к слою анимации и должен сам написать код.Основная анимация: Flipp a view
ниже код работает, но есть три проблемы:
Когда появится вид обратной стороны, это перевернутый горизонтальный.
После завершения анимации я добавляю вид сзади и удаляю фронт. Во время анимации оба представления становятся немного больше из-за перспективы (m34), поэтому, когда CompletionBlock добавляет новое представление на экран, есть уродливая привязка к первоначальному размеру.
Мне нужно задержать CATransaction с блоком (runBlockAfterDelay). Если у меня нет блока, анимация не будет работать.
Заранее спасибо
Для дополнительного кредита :), можно ли иметь код в метод класса? например, + (void) flippFromView ...
- (void)flipFromView:(UIView *)fromView toView:(UIView *)toView spaceBetweenLayers: (CGFloat)spaceBetweenLayers duration:(CGFloat)duration delay:(CGFloat)delay (void))block
{
// Move flipp view back, behind front view
toView.layer.transform = CATransform3DMakeTranslation(0.0, 0.0, -spaceBetweenLayers);;
// Layer that will handle the animation
CALayer *rootLayer = [CALayer layer];
rootLayer.frame = self.frame;
rootLayer.position = fromView.layer.position;
[self.layer addSublayer:rootLayer];
//Transform Layer
CATransformLayer *transformLayer = [CATransformLayer layer];
[transformLayer addSublayer:fromView.layer];
[transformLayer addSublayer:toView.layer];
[rootLayer addSublayer:transformLayer];
[self runBlockAfterDelay:delay block:^{
[CATransaction begin];
[CATransaction setValue:@(duration) forKey:kCATransactionAnimationDuration];
// Completion block
[CATransaction setCompletionBlock:^{
// App crashes with EXC_BAD_ACCESS if we don't move the layer back to the super layer before removing the rootLayer
[self.layer addSublayer:fromView.layer];
[self.layer addSublayer:toView.layer];
// Add new, and remove old layer
[self addSubview:toView];
[fromView removeFromSuperview];
// Set Z position
fromView.layer.zPosition = -10;
toView.layer.zPosition = 10;
// Clean up
[rootLayer removeFromSuperlayer];
}];
// Flipp
CATransform3D flippTransform = CATransform3DMakeRotation(DegreesToRadians(180), 0, 1, 0);
flippTransform.m34 = 1.0f/500.0f;
rootLayer.sublayerTransform = flippTransform;
[CATransaction commit];
}];
}
вы должны принять ответ, если это вам помогло? – Paul