【问题标题】:Flicker when UIViewController is dismissedUIViewController 关闭时闪烁
【发布时间】:2025-12-25 04:05:17
【问题描述】:

我有一个UIViewController,我用它来展示视频广告。一旦用户点击关闭广告按钮,我就会关闭视图控制器,但在它被关闭后不久就会出现闪烁并出现父视图。

这是我在代码中所做的:

@interface myController:UIViewController
@end

static myController* vc = [[myController alloc] init];

@implementation myViewController

-(void) showController
{
    [currentViewController presentViewController : self animated : NO   completion : nil];
}

-(void) hideController
{
   [self dismissViewControllerAnimated : NO completion : nil];
}

-(void) startPlaying
{
    dispatch_async(dispatch_get_main_queue(), ^{
    
    [vc showController];
     //call the method which will play the video.
});
    
}

-(void) viewClosed
{
    dispatch_async(dispatch_get_main_queue(), ^{
    
    [vc hideController];
    
});
}
@end

截图很快,无法获取。

我已尝试使呈现的视图透明,因为我认为在关闭视频广告后闪烁是由于延迟,然后尝试关闭呈现的视图控制器。它可以工作,但在解雇后,父视图似乎正试图进入纵向模式而不是横向模式。这是它的截图:

之前:

之后:

【问题讨论】:

    标签: ios objective-c iphone uiviewcontroller


    【解决方案1】:

    您的根本问题是动画需要时间

    实际上,为 iOS 编程并不是那么容易……假设您需要一个动画来摆脱视图控制器。很好。

    您必须使用完成块 - 您必须等待动画关闭,然后然后(在完成块中)继续进行其他活动。

    简而言之,在关闭视图控制器时,您必须在所有情况下都使用完成块。

    【讨论】:

    • 谢谢你,Joe Blow,我想,我知道,我现在的实际代码可能做错了。我会试一试。谢谢!
    【解决方案2】:

    尝试对动画使用 YES,并注意您是否在 viewWillAppear 中执行某些操作,因为一旦您关闭了presentedViewController,就会调用父 ViewController viewWillAppear。

    【讨论】:

    • 我无权访问源代码,因此,我不知道父视图控制器 viewWillAppear 中发生了什么。我也尝试过对动画使用 YES。我尝试按照这个答案 *.com/questions/12741224/… 使我的呈现视图控制器透明。它可以工作,但是我的父视图处于混乱阶段,我的意思是视频以横向模式出现,但看起来像解雇父视图后尝试进入纵向模式..我将上传一个快照来解释我想说什么..
    • Piyush,我已经添加了上面的截图。
    【解决方案3】:

    我似乎通过使用 CATransition 解决了我的问题。但是,我不喜欢动画。我尝试使用 UIViewControllerTransitioningDelegate 和 UIViewControllerAnimatedTransitioning 创建我的自定义动画,但它不起作用,因为在关闭视图控制器后它显示黑屏,不知道为什么。。 对我有用的代码如下所示...

    CATransition* transition = [CATransition animation];
    transition.duration = 0.05;
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    transition.type = kCATransitionMoveIn;
    transition.subtype = kCATransitionFromTop;
    UIView* containerView = self.view.window;
    [containerView.layer addAnimation:transition forKey:nil]; 
    
    [self dismissViewControllerAnimated : YES completion : nil]
    

    谢谢!

    【讨论】: