模态呈现的 UIViewController 背景颜色随机变化

Posted

技术标签:

【中文标题】模态呈现的 UIViewController 背景颜色随机变化【英文标题】:Background Color Randomly Changes of UIViewController presented Modally 【发布时间】:2015-06-26 16:09:31 【问题描述】:

所以我有一个UIViewController(AViewController),它有一个 UIButton,它以模态方式呈现另一个 UIViewController (BViewController)。 BViewController 有一个模糊 AViewController 的 UIVisualEffectView。在情节提要中,我将以下内容的背景颜色设置为 0% 不透明度:BViewController 的视图,以及 UIVisualEffectView 及其视图。所以它应该是完全透明的,只是有模糊效果。

大多数情况下,这按预期工作。然而,大约三分之一的时间(但随机,即我找不到模式)ViewController 的背景是深灰色而不是清晰的。而且不透明。

我尝试以编程方式确保颜色清晰。如果我在 viewDidLoad 中将背景(BViewController 和 UIVisualEffectView 及其视图)设置为 clearColor,则没有任何变化,即它大约每 4 次中的 3 次起作用。但是,如果我在 viewDidAppear 中设置背景,那么它每次都会变成深灰色的确切颜色,而不是透明的(而不是 1 次 3 次)。

代码很简单,UIViewControllers 设置在故事板中。

在 AViewController 中

var aViewController = storyboard!.instantiateViewControllerWithIdentifier("AViewController") as! 

self.presentViewController(aViewController, animated: false, completion: nil)

在 BViewController 中

self.dismissViewControllerAnimated(false, completion: nil)

**编辑:XCODE 中的简单测试项目以复制问题**

这给了我 9/10 次深灰色背景 - 让我意识到我之前从未展示过没有 segue 的模态 UIViewController。

BViewController

class BViewController: UIViewController 
    @IBAction func exit(sender: AnyObject) 
        self.dismissViewControllerAnimated(false, completion: nil)
    

    override func viewDidLoad() 
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    


AViewController

class AViewController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    


    @IBAction func present(sender: AnyObject) 
        var bViewController = storyboard!.instantiateViewControllerWithIdentifier("bViewController") as! BViewController

        self.presentViewController(bViewController, animated: false, completion: nil)

    

【问题讨论】:

您能否发布一个能够可靠地重现该问题的示例项目?这里不足以重现问题。 @AaronBrager 我现在将努力组装一个。感谢您的帮助。 @AaronBrager 我发布了代码 - 我意识到我之前从未提出过没有 segue 的模态 VC,所以希望我没有过早地问这个问题。 你能分享一下你用来使背景颜色清晰的代码 【参考方案1】:

与 Segue 相关

据我所知,这种情况正在发生,因为当你呈现一个带有 segue 的视图控制器时,它会出现在它所连接的视图控制器上,并且也只放在当前堆栈中,即 ViewControllerA 所在的堆栈中。

没有 segue 连接,即 INITIATING a ViewController

但是当你启动一个视图控制器,即 ViewControllerB 时,它会被加载到一个新的堆栈中,因此它在它下面找不到任何视图控制器,因此在制作 ViewControllerB 的主视图时它会显示为深灰色或黑色颜色为清除颜色。

//我希望我能够传达我的自我,并对你有所帮助。快乐编码:)

【讨论】:

以上是关于模态呈现的 UIViewController 背景颜色随机变化的主要内容,如果未能解决你的问题,请参考以下文章

具有透明背景的模态 UISplitViewController

如何访问呈现模态视图的 UIViewController 类/类名?

呈现模态 UIViewController 时出现奇怪的崩溃

如何以模态方式呈现标准 UIViewController

如果以模态方式呈现,则获取最顶层的 UIViewController

UIViewController 在解除先前呈现的模态视图控制器后被释放