【问题标题】:lagging when push uiviewcontroller推送uiviewcontroller时滞后
【发布时间】:2018-06-22 09:28:05
【问题描述】:

当我使用故事板转场时,在屏幕上显示另一个视图控制器非常流畅。但是,当我不使用storyboard时,只需添加一行简单的代码navigationController?.pushViewController(UIViewController(), animated: true),过渡时有点滞后。

我还读到了Delay when pushing view controller (iOS)。但即使我正在推动一个全新的视图控制器(内部没有额外的代码),转换仍然有点滞后,知道吗?

【问题讨论】:

  • 检查 viewDidLoad 中是否有大量代码
  • 您是否检查过您的 viewDidLoad 是否调用了推送的视图控制器。如果 viewdidLoad 正在调用,请尝试设置视图颜色
  • 您可能操纵了 alfa of View。您能提供示例应用程序以便我为您调试吗
  • 你可能在下一个视图控制器的主线程上做了很多工作。
  • 推得非常好。您所看到的“滞后”是底层先前视图控制器的视图,而不是新视图。

标签: ios swift xcode uinavigationcontroller


【解决方案1】:

Swift 5.3、Xcode 12

我遇到了同样的问题,尝试添加到主线程,但显然问题是我正在推动以编程方式创建的 viewController,而它的 backgroundColor 为 nil。 只需将 pushViewController 中的颜色设置为其他颜色,即可解决问题。

self.view.backgroundColor = yourColor

【讨论】:

  • 是的,这是根本原因。 self.view.backgroundColor = .systemBackground 将支持深色模式。
  • 对我来说,它是在被推送的 VC 的 viewDidLoad 上并在 webView 上设置 isOpaque 属性。
【解决方案2】:

在应用委托中,将窗口的背景颜色设置为红色。

window?.backgroundColor = .red

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

view.backgroundColor = .red

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

【讨论】:

    【解决方案3】:

    我在以编程方式绘制 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
    }
    

    }

    【讨论】:

      【解决方案4】:

      Viewcontroller 期望渲染视图,所以添加下面的视图背景颜色或设置标题

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

      【讨论】:

        【解决方案5】:

        我在模拟器上使用慢速动画进行调试。 “滞后”是@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)
        }
        

        【讨论】:

          【解决方案6】:

          我遇到了同样的问题,将 ui 代码及其约束放入 viewDidLoadloadView() 修复它。现在动画正在顺利移动。

          参考这里:https://stackoverflow.com/a/3424052/10158398

          loadView 是实际设置视图的方法(设置所有 网点,包括 self.view)。

          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)
                  }
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-04-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-04-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多