【问题标题】:iOS views are resizing to screen size with delay on first appeariOS 视图正在调整到屏幕大小,并在首次出现时出现延迟
【发布时间】:2015-09-23 20:20:37
【问题描述】:

我编写了一个使用多个视图的 iOS 应用程序。由于我不想使用故事板,所以我创建了一组视图(xib 文件)和相应的 ViewController(扩展 UIViewController 的 swift 文件)。

创建视图时将所有“模拟指标”设置为推断,“使用自动布局”已打开,“​​使用大小类”也已打开。对于每个元素,都设置了约束,没有错误。

在 AppDelegate.swift 的 func application(application: UIApplication, didFinishLaunchingWithOptions ...) 中,我启动了我的 ViewControllers,例如经过 connectVC = ConnectViewController(nibName: "ConnectView", bundle: nil)

在用户操作(例如按钮单击)和网络操作(例如游戏开始)时,我通过更改 AppDelegate.swift 中的 window.rootViewController 以编程方式使用动画切换视图,确切地说是 like here,但在 Swift 中。

到目前为止,一切都很好。但是每当我第一次显示视图时,视图都会像在我的 Xcode 界面构建器中一样显示缩放/大小,然后在大约半秒到一秒后调整到设备屏幕的正确大小。这发生在 iOS 模拟器和我的真 iPhone 上。

视图在 UIImageViews 中使用了很多图像,但降低分辨率或图片数量不会改变这种行为。

我想加快调整大小,理想情况下,用户不应该在我的视图中看到任何元素大小的调整。我该怎么做?

【问题讨论】:

  • 我认为故事板是最好的选择,并且不要更改根视图控制器。你在哪里写了关于 side 的代码?
  • 可能是线程问题。您可以尝试使用类似dispatch_async(dispatch_get_main_queue(), {YOUR_CODE})
  • 好吧,我发现如果我不使用UIView.transitionFromView(),一切看起来都很好。此外,当使用UIView.transitionFromView() 和选项.ShowHideTransitionViews 时,它会正确调整大小,但会变黑,看起来不太好。

标签: ios iphone xcode swift model-view-controller


【解决方案1】:

问题是我错误地使用了 ViewController 链。简单地更改 window.rootViewController 并执行 UIView.transitionFromView 并不是处理视图切换的缩进方式。

所以我创建了一个包含所有其他 ViewController 实例的 SuperViewController,并使用下面的两个函数在视图之间切换。现在就像一个魅力。

来自 Apple 的 Creating Custom Container View Controllers 文章和 View Controller Programming Guide for iOS 对我帮助很大。

func setViewController(vc: UIViewController) {
    self.addChildViewController(vc)
    vc.view.frame = self.view.bounds
    self.view.addSubview(vc.view)
    vc.didMoveToParentViewController(self)
    self.currentViewController = vc
}

func switchViewController(from: UIViewController, to: UIViewController) {
    from.willMoveToParentViewController(nil)
    self.addChildViewController(to)
    to.view.frame = self.view.bounds
    self.transitionFromViewController(from, toViewController: to, duration: 0.5, options: .TransitionCrossDissolve, animations: nil) { finished in
        from.removeFromParentViewController()
        to.didMoveToParentViewController(self)
        self.currentViewController = to
    }
}

【讨论】:

    【解决方案2】:

    这发生在我身上。首先进入与应用程序一起启动的 GameViewController。然后找到这段代码:

    if let scene = GameScene(fileNamed:"GameScene") {
        // Configure the view.
        let skView = self.view as! SKView!
        /* Sprite Kit applies additional optimizations to improve rendering performance */
        skView.ignoresSiblingOrder = true
        skView.showsFPS = false
        skView.showsNodeCount = false
        /* Set the scale mode to scale to fit the window */
        scene.scaleMode = .ResizeFill
        skView.presentScene(scene)
    }
    

    将所有代码更改为:

    if let skView = self.view as! SKView! {
        let scene = GameScene(size: self.view.bounds.size)
        skView.ignoresSiblingOrder = true
        skView.showsFPS = false
        skView.showsNodeCount = false
        scene.scaleMode = .ResizeFill
        scene.size = skView.bounds.size
        skView.presentScene(scene)
    }
    

    如果您将 GameScene 更改为您的第一个场景,那应该可以。

    【讨论】:

    • 谢谢,但我没有使用 Sprite Kit,所以(过去)不是问题。不过,可能对其他人有帮助。
    • 你介意分享你所有的初始视图控制器的代码
    猜你喜欢
    • 2012-03-21
    • 2015-08-21
    • 2013-04-09
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 2017-12-07
    相关资源
    最近更新 更多