首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

UIViewControllerAnimatedTransitioning在来回动画显示视图时显示黑屏

UIViewControllerAnimatedTransitioning 是 iOS 开发中的一个协议,用于自定义视图控制器的转场动画。当在使用这个协议实现动画时,如果在来回切换视图控制器时出现黑屏,可能是由于以下几个原因造成的:

基础概念

  • UIViewControllerAnimatedTransitioning: 这个协议定义了动画过渡的接口,允许开发者自定义视图控制器之间的转场效果。
  • UIViewControllerContextTransitioning: 提供了转场过程中需要的上下文信息,包括动画的开始和结束状态。

可能的原因

  1. 动画时间设置不当: 动画时间设置得太短,导致视图还没有完全显示出来,动画就已经结束了。
  2. 视图层级问题: 转场动画中的视图层级可能没有正确设置,导致某些视图在动画过程中不可见。
  3. 上下文信息使用错误: 在实现动画时,可能没有正确地使用 UIViewControllerContextTransitioning 提供的信息。
  4. 内存问题: 如果视图控制器或其视图在动画过程中被释放,可能会导致黑屏。

解决方法

  1. 检查动画时间: 确保动画时间足够长,以便视图能够完全显示。
  2. 检查动画时间: 确保动画时间足够长,以便视图能够完全显示。
  3. 正确设置视图层级: 在动画开始前,确保所有需要显示的视图都已经添加到正确的父视图中,并且没有被其他视图遮挡。
  4. 正确设置视图层级: 在动画开始前,确保所有需要显示的视图都已经添加到正确的父视图中,并且没有被其他视图遮挡。
  5. 使用上下文信息: 在动画过程中,使用 UIViewControllerContextTransitioning 提供的 initialFrame(for:)finalFrame(for:) 方法来获取视图的初始和最终位置。
  6. 使用上下文信息: 在动画过程中,使用 UIViewControllerContextTransitioning 提供的 initialFrame(for:)finalFrame(for:) 方法来获取视图的初始和最终位置。
  7. 避免内存问题: 确保在动画过程中视图控制器和视图不会被意外释放。可以使用弱引用来避免循环引用导致的内存泄漏。

示例代码

以下是一个简单的 UIViewControllerAnimatedTransitioning 实现示例,展示了如何创建一个自定义的转场动画:

代码语言:txt
复制
class CustomTransitionAnimator: NSObject, UIViewControllerAnimatedTransitioning {
    func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
        return 0.3
    }

    func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
        guard let fromViewController = transitionContext.viewController(forKey: .from),
              let toViewController = transitionContext.viewController(forKey: .to) else {
            return
        }

        let containerView = transitionContext.containerView
        containerView.addSubview(toViewController.view)

        let finalFrame = transitionContext.finalFrame(for: toViewController)
        toViewController.view.frame = finalFrame.offsetBy(dx: 0, dy: finalFrame.height)

        UIView.animate(withDuration: transitionDuration(using: transitionContext), animations: {
            toViewController.view.frame = finalFrame
        }, completion: { _ in
            transitionContext.completeTransition(!transitionContext.transitionWasCancelled)
        })
    }
}

应用场景

自定义转场动画广泛应用于需要特殊视觉效果的应用中,如游戏界面切换、多媒体播放器、以及任何希望提升用户体验的场景。

通过以上方法,你应该能够解决在使用 UIViewControllerAnimatedTransitioning 实现动画时遇到的黑屏问题。如果问题依旧存在,建议检查视图控制器的生命周期管理以及内存使用情况。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android控件显示、隐藏时,增加动画效果

Android控件显示、隐藏时,增加动画效果 首先还是看一下演示效果吧,不然凭什么相信我的帖子能解决你的问题呢? 效果GIF如下 ?...动画效果就是这样,如果不符合你的要求,就不浪费你宝贵的时间了,如果是你想要的效果就请往下看。 话不多说,我直接贴代码,有不明白的可以在评论区问我: activity_main.xml <?...private void translateAnimation() { //向上位移显示动画 从自身位置的最下端向上滑动了自身的高度 translateAniShow...,因为隐藏和显示不一样, //必须在动画结束之后再隐藏你的控件,这样才不会显得很突兀 alphaAniHide.setAnimationListener...android:toXScale="0" android:toYScale="0" /> 你只要把上面的代码复制到你的项目里面即可实现效果,很简单的,有什么问题可以直接评论区发问,我会第一时间回复的

5K30
  • WPF 动画实战 点击时显示圆圈淡出效果

    本文告诉大家一个有趣的动画,在鼠标点击的时候,在点击所在的点显示一个圆圈,然后这个圆圈做动画变大,但是颜色变淡的效果。...在 WPF 可以通过 Ellipse 控件显示椭圆,如果设置他的宽度和高度相同,那么就是一个圆,添加一个 Ellipse 的代码请看下面 var currentSize = 10...这样的做法太渣了,所以 WPF 框架就提供了 GetPosition 拿到相对于某个元素的鼠标点击 在拿到鼠标点击到 Canvas 的坐标时如何设置刚才创建的圆圈的坐标,可以通过 TranslateTransform...,在使用 DoubleAnimation 时将会从对应属性的当前值修改到指定值,修改的速度可以通过速度函数设置,默认使用匀速动画。...storyboard.Begin(); 此时点击 Canvas 容器的时候,就可以看到在鼠标点击显示圆圈,然后圆圈不断变大 当然,还有下一步就是让圆圈变淡,在 WPF 中可以通过修改圆圈的透明度做动画

    2.5K20

    VCTransitionsLibrary –自定义iOS交互式转场动画的库

    使用 在自定义转场动画时,有两类关键的类: 动画控制器 –  这个类是用来实现自定义动画的.但你声明想要使用自定义动画时,你应该提供一个动画控制器.这个类会实现需要的动画,完成时会通知框架....交互控制器 – 这个类是用来管理交互的-那些通常由某个手势空控制的交互,允许用户通过滑动,轻扫或执行其他操作来实现两个视图控制器的导航.必须指出的是,交互控制器允许导航取消,例如,一个用户可以在正在导航至某一页面时...协议被用来在模态控制器显示/隐藏时提供一个动画控制器.当一个视图控制器被模态显示或隐藏时,它的transitioningDelegate属性用来提供UIViewControllerTransitioningDelegate...担当代理角色的类,通过 animationControllerForPresentedController: presentingController: sourceController: 方法返回模态显示时的动画...交互控制器负责给视图添加手势,并负责在用户使用某个手势时进行相应地导航操作.

    1.6K60

    iOS_Custom Transition Animation 自定义转场动画

    1、push-pop 动画协议 想要在 push 和 pop viewController 时使用自定义的转场动效,需要设置self.naviagtionController.delegate, 并实现...you like. ---- 3、实现转场动画协议 以上2个协议返回的4个animator都是实现了UIViewControllerAnimatedTransitioning协议的对象。...NO-fail } ---- 3.4 pop or dismiss animation (消失动画) 大致跟显示动画一致,转场动画都是需要显示toView, 让fromView消失 上面显示动画的例子...动画成功:toView就显示在conatinerView上,进入的是下一个页面 动画失败即转场失败:则应该将toView从容器上移除,即还停留在原来的页面上。...然后在presentationTransitionWillBegin和dismissalTransitionWillBegin方法里执行的动画,仅是添加了一个偏暗的背景View,然后调整alpha动画显示和消失

    35221

    iOS 转场动画探究(一)

    在下面你肯定会大量的看到它,对于这个Transition(转场)过程中视图控制器和其对应的视图在结构上的变化我在巧神的博客中看到这张图,说实话,不太理解这张图表达了的是什么,把这张图给大家分享出来,你要理解的话可以留言大家讨论一下...中切换 Tab;          3、Modal 转场:presentation 和 dismissal,俗称视图控制器的模态显示和消失,仅限于modalPresentationStyle属性为 UIModalPresentationFullScreen...1、先说说  modalTransitionStyle,这个是控制器跳转时系统给的几个动画风格,这个在iPhone上用的比较多: typedef NS_ENUM(NSInteger, UIModalTransitionStyle...如果是从A视图控制器present到B,则A是fromView,B是toView。从B视图控制器dismiss到A时,B变成了fromView,A是toView。...和,dismiss时,必须将toview添加到视图层次中 [contentView addSubview:toView]; // 获取执行时长

    2.7K50

    iOS 自定义转场动画

    模态化present和dismiss 自定义转场 1、创建一个遵循UIViewControllerAnimatedTransitioning>协议的动画过渡管理对象,并实现如下两个方法: //返回动画事件...containerView上才能进行,可以理解containerView管理着所有做转场动画的视图 UIView *containerView = [transitionContext containerView...percentComplete]; //完成转场操作 [self finishInteractiveTransition]; //取消转场操作 [self cancelInteractiveTransition]; 3、转场时最上层的视图控制器需要遵循...同上 3、在push动画之前设置导航控制器的转场动画代理,转场时最上层的视图控制器需要遵循的协议,并设置为代理,并实现如下代理方法:...//在push动画之前设置转场动画代理 self.navigationController.delegate = animationFour; #pragma mark -- UINavigationControllerDelegate

    1.3K50

    玩转iOS转场动画 原

    本篇博客主要深入讨论视图控制器、导航控制器来进行界面跳转时的专场动画相关内容。...在界面跳转时,将要弹出的视图控制器设置如下: ViewController2 * v2 = [ViewController2 new]; self.transDelegate = [[TransDelegate...协议的对象,UIViewControllerAnimatedTransitioning则用来负责具体的动画展示,例如我们在创建一个命名为AniObject的类,继承自NSObject,使其实现UIViewControllerAnimatedTransitioning...协议,在TransDelegate类中实现如下: - (nullable id UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController...我们在使用系统的导航控制器时,右划返回效果对用户体验十分友好,我们下面就来试着将视图控制器的模态跳转设计成类似导航可交互的。

    1.4K51

    iOS 自定义 ViewController 过渡动画

    就想着自己也来玩一下,顺便把之前没写成的 Custom ViewController Transition 自定义视图控制器过渡的文章也一起搞定了。...这里只以这个动画的实现为主线,更系统的介绍请移步上面的相关链接。 视图控制器过渡,就是指图片里那种 ViewController 的过渡效果。(好废话。。。)...NavigationController 的详细页面中从屏幕左侧滑入以返回时的那个动画。...{ super.viewDidLoad() self.delegate = self // delegate设置为self } /* 如GIF中那样在切换时改变状态栏颜色...并且开始时的path设置为上面的start——位置在点击的tab上的一个半径为0的圆。 // 下文中就要给这个path加特技,让他变化到包含整个界面那么大。

    1.4K31

    iOS 自定义转场动画

    模态化present和dismiss 自定义转场 1、创建一个遵循UIViewControllerAnimatedTransitioning>协议的动画过渡管理对象,并实现如下两个方法: //返回动画事件...containerView上才能进行,可以理解containerView管理着所有做转场动画的视图 UIView *containerView = [transitionContext containerView...percentComplete]; //完成转场操作 [self finishInteractiveTransition]; //取消转场操作 [self cancelInteractiveTransition]; 3、转场时最上层的视图控制器需要遵循...同上 3、在push动画之前设置导航控制器的转场动画代理,转场时最上层的视图控制器需要遵循的协议,并设置为代理,并实现如下代理方法: /.../在push动画之前设置转场动画代理 self.navigationController.delegate = animationFour; #pragma mark -- UINavigationControllerDelegate

    1.1K90
    领券