xcode 推uiviewcontroller时滞后

uqjltbpv  于 2023-05-01  发布在  其他
关注(0)|答案(6)|浏览(211)

当我使用故事板Segue时,屏幕上显示另一个视图控制器是相当流畅的。然而,当我不使用故事板时,只需添加一行简单的navigationController?.pushViewController(UIViewController(), animated: true)代码,它在过渡中有点滞后。
我也读过Delay when pushing view controller (iOS)。但是即使我正在推动一个全新的视图控制器(内部没有额外的代码),转换仍然有点滞后,你知道吗?

wa7juj8i

wa7juj8i1#

Swift 5.3,Xcode 12

我也面临着同样的问题,尝试添加到主线程,但显然问题是,我正在推动编程创建的viewController,其backgroundColor为nil。只需将pushedViewController中的颜色设置为其他颜色,就解决了这个问题。

self.view.backgroundColor = yourColor
hsvhsicv

hsvhsicv2#

在app delegate中,将窗口的背景色设置为红色。

window?.backgroundColor = .red

同样在推视图控制器中,将其视图设置为红色。

view.backgroundColor = .red

我在以编程方式将视图控制器嵌入UINavigationController时遇到了同样的问题。

wgeznvg7

wgeznvg73#

我在以编程方式绘制UI时遇到了同样的问题。
在我的例子中,重写loadView函数解决了我的问题。

import UIKit

class MyViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.title = "My tasks"
}

override func loadView() {
    // You can load your view here. For simplicity, I just give it a background color
    let v = UIView()
    v.backgroundColor = UIColor.orange

    view = v // This line does the magic
}

}

csbfibhn

csbfibhn4#

ViewController期望呈现视图,因此在视图下面添加背景颜色或设置标题

override func viewDidLoad() {
            super.viewDidLoad()
            self.navigationItem.title = "Title"
            self.view.backgroundColor = .red
    
        }
e0uiprwp

e0uiprwp5#

我在模拟器上用慢速动画进行调试。“滞后”是底层的前一个视图控制器的视图,如@yesleon所提到的。当viewWillDisappear时,我将前一个视图的alpha设置为0,当viewWillAppear时,设置为1。现在推到新的控制器似乎好多了,但是推回到原来的视图控制器,还是有点不完美,有更好的解决方案吗?

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.tabBarController?.tabBar.isHidden = false
    view.alpha = 1.0
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    self.tabBarController?.tabBar.isHidden = true
    view.alpha = 0.0
}

@IBAction func barbuttonDidTapped(_ sender: UIBarButtonItem) {
    navigationController?.pushViewController(UIViewController(), animated: true)
}
n7taea2i

n7taea2i6#

我遇到了同样的问题,把ui代码和它在viewDidLoad中的约束放到loadView()中来解决它。现在动画正在平滑移动。
参考:https://stackoverflow.com/a/3424052/10158398
loadView是实际设置视图的方法(设置所有outlet,包括self。视图)。
viewDidLoad你可以通过它的名字来弄清楚。它是一个委托方法,在视图被加载(所有的插座都被设置好)之后调用,它只是通知控制器它现在可以开始使用插座了。
viewDidLoad:“在视图控制器将其关联的视图加载到内存中后调用此方法。无论视图是存储在nib文件中还是在loadView方法中以编程方式创建,都将调用此方法。“
loadView:“如果您手动创建视图,则必须重写此方法并使用它来创建视图。“

举例:

class DetailViewController: UIViewController {
    let imageView = UIImageView()
    var picture: Picture?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }
    
    override func loadView() {
        view = UIView()
        view.backgroundColor = .white
        
        imageView.translatesAutoresizingMaskIntoConstraints = false
        imageView.contentMode = .scaleAspectFit
        view.addSubview(imageView)
        
        NSLayoutConstraint.activate([
            imageView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            imageView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
            imageView.centerYAnchor.constraint(equalTo: view.centerYAnchor)
        ])
        
        if let picture = picture {
            let path = getDocumentDirectory().appendingPathComponent(picture.picture)
            imageView.image = UIImage(contentsOfFile: path.path)
        }
    }

相关问题