在 viewDidLoad 中更改视图定位

Mr *_*son 4 position view swift

我试图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)


    })
Run Code Online (Sandbox Code Playgroud)

viewDidLoad但是,如果我使用 a 分配给按钮,这似乎不能直接在代码中工作@IBAction

我猜我在这里遗漏了一些东西,但我不知道是什么。

Ahm*_*d F 5

参考您在评论中关于使用约束的答案:

是的,我愿意。我想这和它有关系吗?约束是在 viewDidLoad 之后加载的吗?

是的,来自viewDidLoad()文档:

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

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

如果我没有记错的话,您正在寻找的是viewDidLayoutSubviews()方法:

调用以通知视图控制器其视图刚刚布置了其子视图。

您的视图控制器可以重写此方法,以便在视图布置其子视图后进行更改。此方法的默认实现不执行任何操作。

viewDidLoad()因此,不要在try to let it 中实现更改视图 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)
    })
}
Run Code Online (Sandbox Code Playgroud)

另外: 如果你不想让动画在弹出/关闭下一个 ViewController 后重复,你可以声明一个flag属性来确定是否启动动画,类似于:

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
            })
        }
    }
Run Code Online (Sandbox Code Playgroud)

附加说明:

我建议更改约束值,而不是直接更改帧大小/原点。您可能想检查这个问题/答案。