呈现没有动画的 ViewController 会瞬间显示呈现者 UIViewController

Posted

技术标签:

【中文标题】呈现没有动画的 ViewController 会瞬间显示呈现者 UIViewController【英文标题】:Presenting a UIViewController without animation shows the presenter UIViewController for an istant 【发布时间】:2017-07-28 09:43:22 【问题描述】:
// AppDelegate.swift

let navigationController = UINavigationController()
self.window = UIWindow(frame: UIScreen.main.bounds)
self.window!.rootViewController = navigationController
self.window!.makeKeyAndVisible()

let homeViewController = HomeViewController()
navigationController.pushViewController(homeViewController, animated: false)
if !isLoggedIn 
    let authViewController = AuthViewController()
    navigationController.present(authViewController, animated: false)

我有类似的情况。如果没有用户通过身份验证,我想显示身份验证屏幕。上面的代码有效,但问题是,在几分之一秒内,我可以看到 HomeViewController 在 AuthViewController 以模态方式呈现之前没有动画。我怎样才能防止这种情况发生?

这是一个显示问题的 GIF。

编辑:我不想使用 if/else 语句。我希望 HomeViewController 始终位于 AuthViewController 下方。

【问题讨论】:

【参考方案1】:

// APPDelegate

  -(void)launchScreen
    UIStoryBoard * storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];

        if ([[NSUserDefaults standardUserDefaults] valueForKey:USERID])
        
            // here show the Dashboard or LoggedIn Screen
        else
             // here show the Login Screen or Authentication Screen
                                                                               
        

【讨论】:

我想把 HomeViewController 设置为 UINavigationController 的根目录 默认情况下你想显示homeViewController和应用程序内部如果用户想登录或登录你应该显示登录屏幕并显示登录状态我对吗?? 是的,但是如果没有登录,他们应该永远不会看到 HomeViewController。我只是想把它放在层次结构中。这就是为什么如果用户未登录,我想立即在其上方显示 AuthViewController 默认情况下不应该看到家庭 VC ???好的,你能告诉我一件事,当应用程序启动时你想显示登录屏幕或主屏幕吗?这样我就可以告诉你如何管理 你的问题解决了吗??【参考方案2】:

为什么不使用 if/else 块?

if !isLoggedIn 
    let authViewController = AuthViewController()
    navigationController.present(authViewController, animated: false)
 else 
    let homeViewController = HomeViewController()
    navigationController.pushViewController(homeViewController, animated: false)

【讨论】:

因为我需要 HomeViewController 始终位于 AuthViewController 之下。注册后,AuthViewController 将被解除。当用户注销时,会显示 AuthViewController 当用户刚登录时,您可以先显示 HomeViewController 然后关闭 AuthViewController。或者您是否尝试在呈现 HomeViewController 之前放置 if 块? 是的,我可以这样做,但这不是我想要达到的效果。我尝试在呈现 HomeViewController 之前放置 if 块,但我得到了同样的口吃【参考方案3】:

问题可能是在您检查用户是否经过身份验证之前,您的 HomeViewController 正在完整创建。将检查身份验证的代码移动到您的 HomeViewController 中的 viewDidLoad 方法中,看看是否有区别。

【讨论】:

我不会让我的视图控制器知道彼此。我正在使用coordination pattern,所以我不能这样做。我提供的代码没有显示这一点,但暗示我受到这种情况的限制 好吧,我的 VC 总是很瘦 ;) 如果你确实移动了代码,问题会消失吗?如果是这样,至少我们知道错误的来源,那么您可以将其放入这个新奇特的模式中:D 我提供的代码正是我正在使用的代码。只是安排不同而已。我的要求可能不可行! 你们这些小信仰!我只是说 try 将它移动到 HomeViewController(5 分钟),看看这是否会有所不同。如果是这样,那么我们就知道为什么要显示该视图。如果它没有任何区别,那就是一个不同的错误。【参考方案4】:

我所做的是在 viewDidLoad 时间为红色视图控制器加载 (loadNibNamed:owner:options:) 我的启动屏幕的副本(视图控制器)并将该控制器的根视图添加到红人的根视图.这样红人就躲在似乎仍然是启动屏幕的后面。 (确保在 viewDidLayoutSubviews 时间,假启动屏幕的框架设置为红人的边界。)

然后在您的登录控制器启动并覆盖它之后摆脱虚假的启动屏幕。或者,如果您从不启动登录控制器,只需在 fake guy 上设置一个 alpha 渐变动画并将其从 red guy 的根视图中移除。

您可能需要在它的 viewDidAppear: 方法中跟踪红人第一次出现(或其他说登录状态)的时间。

【讨论】:

以上是关于呈现没有动画的 ViewController 会瞬间显示呈现者 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章

CALayer 旋转动画不适用于呈现的 ViewController

UIViewController 默认过渡动画不起作用

addSubview与呈现模式ViewController之间的区别?

iOS:具有透明背景的模态 ViewController

以编程方式呈现新的 ViewController [Swift 3]

轻松实现部分背景半透明的呈现效果