呈现视图控制器转场动画

12

在我的代码中,我使用presentViewController来调用我的第二个视图控制器

[self presentViewController:secondController animated:YES completion:nil];

当我调用时,我需要显示从左到右的动画(就像在导航控制器中一样)。

我不想使用导航控制器,但我需要类似于在presentViewController中导航控制器的动画...

5个回答

15

在呈现视图控制器之前添加此行代码

secondController.modalTransitionStyle   = UIModalTransitionStyleCrossDissolve;
secondController.modalPresentationStyle = UIModalPresentationFullScreen;

// Take a look at this enum

typedef enum {
   UIModalTransitionStyleCoverVertical = 0,
   UIModalTransitionStyleFlipHorizontal,
   UIModalTransitionStyleCrossDissolve,
   UIModalTransitionStylePartialCurl,
} UIModalTransitionStyle;

没有,它没有工作,只是没有动画效果。 secondController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; // 看看这个枚举 typedef enum { UIModalTransitionStyleCoverVertical = 0, UIModalTransitionStyleFlipHorizontal, UIModalTransitionStyleCrossDissolve, UIModalTransitionStylePartialCurl, } UIModalTransitionStyle; [self presentViewController:secondController animated:YES completion:nil]; - Subramanian Raj
我像这样写,但它没有起作用。secondController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;; secondController.modalPresentationStyle = UIModalPresentationFullScreen; ; // 看一下这个枚举 typedef enum { UIModalTransitionStyleCoverVertical = 0, UIModalTransitionStyleFlipHorizontal, UIModalTransitionStyleCrossDissolve, UIModalTransitionStylePartialCurl, } UIModalTransitionStyle; [self presentViewController:secondController animated:YES completion:nil]; - Subramanian Raj
@SubramanianRaj 在调用[UIViewController presentViewController:animated:completion]之前,您是否设置了这些属性? - Ch0k0l8
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"iPhone5" bundle:nil]; HomeViewController *secondController = (HomeViewController *)[storyboard instantiateViewControllerWithIdentifier:@"test"]; secondController.LoginID= aID; secondController.LoginUsername= aUsername; secondController.UserProfileImage=ProfileImage; secondController.UserOtherInfo=UserInfo; - Subramanian Raj
@SubramanianRaj 好的,将您的演示样式更改为UIModalPresentationStyleOverCurrentContext。 - Ch0k0l8
在 iOS 11 中,只有设置 yourVC.modalTransitionStyle 才能正常工作。 - Shehroz

6

对于Swift语言

定义动画类型


enum UIModalTransitionStyle : Int {
    case CoverVertical = 0
    case FlipHorizontal
    case CrossDissolve
    case PartialCurl
}

如何使用


let vc : PageHomeViewController = storyboard!.instantiateViewControllerWithIdentifier("PageHomeViewController") as! PageHomeViewController
vc.modalTransitionStyle = .FlipHorizontal
self.presentViewController(vc, animated: true, completion: nil)

3
我将翻译如下:

我决定使用UIViewControllerTransitioningDelegate来解决动画“cover horizontal”的问题,就像UINavigationViewController的push方法一样。

1.创建自定义转场。

标题

@interface CoverHorizontalTransition: NSObject<UIViewControllerAnimatedTransitioning>
@property (assign, nonatomic) BOOL dismiss;
@end

实现

@implementation CoverHorizontalTransition

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

    UIViewController *toViewController;
    toViewController =
    [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

    UIView *containerView = transitionContext.containerView;

    CGRect animatedViewFrame;
    animatedViewFrame = containerView.bounds;
    animatedViewFrame.origin = CGPointMake(CGRectGetWidth(animatedViewFrame), 0);

    [containerView addSubview:toViewController.view];

    if (_dismiss) {
        [containerView bringSubviewToFront:fromViewController.view];

        [UIView
         animateWithDuration:[self transitionDuration:transitionContext]
         animations:^{
             fromViewController.view.frame = animatedViewFrame;
         } completion:^(BOOL finished) {
             [containerView.superview addSubview:toViewController.view];
             [fromViewController.view removeFromSuperview];
             [transitionContext completeTransition:YES];
         }];
    } else {
        toViewController.view.frame = animatedViewFrame;

        [UIView
         animateWithDuration:[self transitionDuration:transitionContext]
         animations:^{
             toViewController.view.center = containerView.center;
         } completion:^(BOOL finished) {
             [transitionContext completeTransition:YES];
         }];
    }
}

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

@end

2.创建过渡委托。

@implementation CustomViewControllerTransitioningDelegate

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source
{
    return [CoverHorizontalTransition new];
}

- (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed
{
    CoverHorizontalTransition *transition;
    transition = [CoverHorizontalTransition new];
    transition.dismiss = YES;

    return transition;
}

@end

使用示例。

...
// Save delegate to strong property
secondController.customTransitioningDelegate =
[BaseViewControllerTransitioningDelegate new];

secondController.transitioningDelegate =
secondController.customTransitioningDelegate;
secondController.modalPresentationStyle = UIModalPresentationCustom;

[self presentViewController:secondController animated:YES completion:nil];

此代码适用于iOS 10及以上版本。

在我看来,这是最好的解决方案。它的工作方式就像导航控制器转换一样。谢谢。 - Guy Lowe
根据苹果的文档 https://developer.apple.com/library/archive/featuredarticles/ViewControllerPGforiPhoneOS/CustomizingtheTransitionAnimations.html#//apple_ref/doc/uid/TP40007457-CH16-SW15,您应该使用 viewForKey 方法获取要添加或删除的视图,而不是使用视图控制器的 view 属性。 - Arda

0
所有这些也可以在故事板中实现,而无需编写代码。单击链接视图控制器的segue,然后选择右侧菜单中的 Attributes Inspector 选项卡。在 Kind 下拉菜单中选择“以模态形式呈现”。会出现另一组选项。在 Transition 下拉菜单中,您将能够选择上面列出的任何枚举。Segue Attributes Inspector


-1

@swiftboy 的回答最正确。你不需要声明枚举,可以直接调用。

let vc : PageHomeViewController = 
storyboard!.instantiateViewControllerWithIdentifier("PageHomeViewController") 
as! PageHomeViewController
vc.modalTransitionStyle = .FlipHorizontal 
self.presentViewController(vc, animated: true, completion: nil)

这只是另一个回答的副本,请只在您有新内容要添加时添加回答。 - FluffyKitten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接