iOS视图调整为屏幕大小,首次显示延迟

时间:2015-07-06 15:42:08

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

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

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

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

在用户操作(例如按钮点击)和网络操作(例如游戏开始)上,我通过更改AppDelegate.swift中的window.rootViewController,以及在Swift中完全like here,以编程方式切换视图。

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

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

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

2 个答案:

答案 0 :(得分:0)

这发生在我身上。首先进入使用该应用程序启动的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更改为您的第一个场景,那应该可行。

答案 1 :(得分:0)

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

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

来自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
    }
}