在viewDidLoad中更改视图位置

时间:2016-12-26 10:36:38

标签: swift view position

我尝试使用此代码通过View在启动应用时更改单独viewDidLoad的位置:

let xPosition = dynView.frame.origin.x - 100

    //View will slide view
    let yPosition = dynView.frame.origin.y;

    let height = dynView.frame.size.height
    let width = dynView.frame.size.width

    UIView.animate(withDuration: 1.0, animations: {

        self.dynView.frame = CGRect(x: xPosition, y: yPosition, width: width, height: height)


    })

但是,如果我使用viewDidLoad分配给按钮

,这似乎无法直接在@IBAction代码中运行

我猜这里错过了一些东西,但我无法弄清楚是什么。

1 个答案:

答案 0 :(得分:3)

请参阅您的回答 - 关于使用约束的评论:

  

是的,我知道。我认为这与它有关吗?是个   viewDidLoad后加载的约束?

这是正确的,来自viewDidLoad()文档:

  

在控制器的视图加载到内存后调用。

与检查约束的设置是否已完成(子视图已布置)无关。

如果我没有误会,你要找的是viewDidLayoutSubviews()方法:

  

调用以通知视图控制器其视图刚刚布局   它的子视图。

     

您的视图控制器可以覆盖此方法以进行更改   该视图列出了其子视图。这个的默认实现   方法什么都不做。

因此,不要在viewDidLoad()中实现更改视图的y位置的代码,而是尝试将其放在viewDidLayoutSubviews()中,如下所示:

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

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    let xPosition = dynView.frame.origin.x - 100
    let yPosition = dynView.frame.origin.y

    let height = dynView.frame.size.height
    let width = dynView.frame.size.width

    UIView.animate(withDuration: 1.0, animations: {
        self.dynView.frame = CGRect(x: xPosition, y: yPosition, width: width, height: height)
    })
}

同时 如果您不希望在弹出/关闭下一个ViewController后让动画重复,您可以声明标志属性以确定是否启动动画,类似于:

var isAnimated = false

    override func viewDidLayoutSubviews() {
        if isAnimated == false {
            super.viewDidLayoutSubviews()

            UIView.animate(withDuration: 1.0, animations: {
                self.btn.frame.origin.y = 20
            }, completion: { _ in
                self.isAnimated = true
            })
        }
    }

附加说明:

我建议更改约束的值,而不是直接更改帧大小/原点。您可能需要查看this question/answer.

希望这会有所帮助。