为什么每次点击 UITextField 时都会调用 viewDidLayoutSubviews

Why is viewDidLayoutSubviews called everytime a UITextField is tapped

我有一个 viewController,其中包含一个 view,里面有四个 UITextFields。我想要做的是在加载 ViewController 后立即为视图设置动画。

加载控制器时,动画按照我想要的方式工作,但由于某种原因,每次我点击任何 UITextFields 时都会调用 viewDidLayoutSubviews,因此它会一直为视图设置动画。

这是正常行为吗,每次点击 TextField 时是否应该调用 viewDidLayoutSubviews?

这是我的代码:

class MyViewController: UIViewController{

    @IBOutlet weak var viewAlertContainer: UIView!

    override func viewDidLayoutSubviews() {
        showAlertViewWithAnimation()
    }

    func showAlertViewWithAnimation(){
        UIView.animate(withDuration: 0.5, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 2, options: .curveEaseIn, animations: {
            self.viewAlertContainer.frame.origin.y = 150
        })
    }
}

viewDidLayoutSubviews() 将在任何时候被调用 Auto Layout 认为它有工作要做,而且这可能会在您意想不到的时候发生。这使得执行一次发生的操作成为一个糟糕的选择。

将您的动画移至覆盖 viewDidAppear()。这是您第一次知道可以看到视图,因此是执行动画的合适位置。

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

    showAlertViewWithAnimation()
}