9

这让我快疯了。只有在第一次运行时 viewDidLayoutSubviews 才会被调用两次。

这是我正在使用的代码:

class CICViewController: UIViewController {


    override func viewDidLoad() {
        super.viewDidLoad()
    }



    func addQLabel(qLabel: UILabel, questionString: String, bgrLabel: UILabel) {// some code goes here
    }

    func makeRoundQButtons(qButtons:[UIButton]) {
      // some code goes here

    }

    func addArrows(numberOfArrows:Int, buttonCurAngle:Double) {//some code goes here
    }

    func animateButtons(qButtons:[UIButton], buttonCurAngle:Double) {

     // some code goes here

    }



    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)

    }

    func backTapped(sender: UIBarButtonItem) {
        navigationController?.popViewControllerAnimated(false)
       //some code goes here

    }

    func restartTapped(sender: UIBarButtonItem) {
        navigationController?.popToRootViewControllerAnimated(false)
        //some code goes here
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

} 

在我的 ViewController 我称之为:

class OneViewController: CICViewController {

  override func viewDidLoad() {
        super.viewDidLoad()

 //some code goes here
}


    override func viewDidLayoutSubviews() {

        super.viewDidLayoutSubviews()
        print("viewDidLayoutSubviews")
        self.makeRoundQButtons(qButtons)
        self.animateButtons(qButtons, buttonCurAngle: 2.0)

    }

    override func viewDidAppear(animated: Bool) {
     //nothing goes here
    }


}
4

2 回答 2

4

viewDidLayoutSubviews无法保证调用多少次。

您可以在这篇 Stack Overflow 帖子中找到一个很好的讨论:
何时调用 layoutSubviews?

于 2016-05-14T14:15:48.543 回答
2

我发现这篇文章很有用。它所说的摘要:

  • init不会导致layoutSubviews被调用(duh)
  • addSubview导致layoutSubviews在添加的视图、添加到的视图(目标视图)以及目标视图的所有子视图上调用
  • setFrame只有当框架的大小参数不同时,才智能地调用layoutSubviews设置了框架的视图
  • 滚动要在 上调用的UIScrollView原因,它是超级视图layoutSubviewsscrollView
  • 旋转设备仅调用layoutSubview父视图(响应的viewControllers主视图)
  • removeFromSuperviewlayoutSubviews仅在 superview 上调用(不在表格中显示)
于 2017-08-09T06:50:43.330 回答