iOS   发布时间:2022-03-31  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – 自定义Segue动画大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用自定义段来执行一种缩放动画.
当执行转换时,sourceViewController将变为黑色,然后进行缩放.

尝试将pushViewController设置为完成块,但转换不会完全执行.

- (void)perform {

    UIViewController *sourceViewController = (UIViewController *) self.sourceViewController;
    UIViewController *desTinationViewController = (UIViewController *) self.desTinationViewController;

    [desTinationViewController.view setTransform:CGAffineTransformMakeScale(0.5,0.5)];
    [desTinationViewController.view setAlpha:0.0];

    [UIView animateWithDuration:0.5
                          delay:0.0
                        options:UIViewAnimationCurveEaSEOut 
                     animations:^{
                         [desTinationViewController.view setTransform:CGAffineTransformMakeScale(1.0,1.0)];
                         [desTinationViewController.view setAlpha:1.0];
                         [sourceViewController.navigationController pushViewController:desTinationViewController animated:NO];
                     } 
                     completion:^(BOOL finished){
                     }];

}

我做错了什么?

解决方法

感觉kludgy,但您可以尝试添加desTinationViewController.view作为动画之前的子视图,然后当动画完成后,删除它并将其推回而不用动画.在过渡之前解决黑屏,但也可能不完美,这取决于您想要使用导航栏的内容,但也可能更接近:
[sourceViewController.view addSubview:desTinationViewController.view];
[desTinationViewController.view setFrame:sourceViewController.view.window.frame];
[desTinationViewController.view setTransform:CGAffineTransformMakeScale(0.5,0.5)];
[desTinationViewController.view setAlpha:1.0];

[UIView animateWithDuration:0.5
                      delay:0.0
                    options:UIViewAnimationCurveEaSEOut 
                 animations:^{
                     [desTinationViewController.view setTransform:CGAffineTransformMakeScale(1.0,1.0)];
                     [desTinationViewController.view setAlpha:1.0];
                 } 
                 completion:^(BOOL finished){
                     [desTinationViewController.view removeFromSuperview];
                     [sourceViewController.navigationController pushViewController:desTinationViewController animated:NO];
                 }];

注意,有效的iOS 7,您将使用自定义转换.有关更多信息,请参阅WWDC 2013 Custom Transitions Using View Controllers.

例如,如果尝试使用导航控制器进行自定义转换,则第一个视图控制器将自己指定为导航控制器的代理:

self.navigationController.delegate = self;

然后,它将分别指定push和pop的自定义动画师:

- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
                                  animationControllerForOperation:(UINavigationControllerOperation)operation
                                               fromViewController:(UIViewController *)fromVC
                                                 toViewController:(UIViewController *)toVC
{
    if (operation == UINavigationControllerOperationPush) {
        return [[PushAnimator alloc] init];
    } else {
        return [[PopAnimator alloc] init];
    }
}

那么你显然会实现这些动画师:

@interface PushAnimator : NSObject <UIViewControllerAnimatedTransitioning>

@end

@implementation PushAnimator

- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext
{
    return 0.5;
}

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
    UIViewController* toViewController   = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIViewController* fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];

    [[transitionContext containerView] addSubview:toViewController.view];
    toViewController.view.frame = fromViewController.view.frame;
    toViewController.view.transform = CGAffineTransformMakeScale(0.5,0.5);
    toViewController.view.alpha = 0.0;

    [UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0.0 options:0 animations:^{
        toViewController.view.transform = CGAffineTransformIdentity;
        toViewController.view.alpha = 1.0;
    } completion:^(BOOL finished) {
        [fromViewController.view removeFromSuperview];
        [transitionContext completeTransition:![transitionContext transitionWasCancelled]];
    }];
}

@end

@interface PopAnimator : NSObject <UIViewControllerAnimatedTransitioning>

@end

@implementation PopAnimator

- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext
{
    return 0.5;
}

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
{
    UIViewController* toViewController   = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIViewController* fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];

    [[transitionContext containerView] insertSubview:toViewController.view belowSubview:fromViewController.view];
    toViewController.view.frame = fromViewController.view.frame;

    [UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0.0 options:0 animations:^{
        fromViewController.view.transform = CGAffineTransformMakeScale(0.5,0.5);
        fromViewController.view.alpha = 0.0;
    } completion:^(BOOL finished) {
        [fromViewController.view removeFromSuperview];
        [transitionContext completeTransition:![transitionContext transitionWasCancelled]];
    }];
}

@end

大佬总结

以上是大佬教程为你收集整理的ios – 自定义Segue动画全部内容,希望文章能够帮你解决ios – 自定义Segue动画所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。