【问题标题】:Change View Positing in viewDidLoad在 viewDidLoad 中更改视图位置
【发布时间】:2017-05-10 20:10:36
【问题描述】:

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

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 分配给按钮,则代码可以工作

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

【问题讨论】:

  • 你使用约束吗?
  • 是的,我愿意。我假设这与它有关?约束是在 viewDidLoad 之后加载的吗?
  • aha,你明白了 :) 顺便说一句,通过更改负责的约束常量值来更改视图的 y 位置的正确方法。
  • 放入viewDidAppear()

标签: swift view position


【解决方案1】:

参考您在 cmets 中关于使用约束的回答:

是的,我知道。我假设这与它有关?是个 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 后重复播放,可以声明一个 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
            })
        }
    }

补充说明:

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

【讨论】:

  • 你不觉得 viewDidLayoutSubviews 方法是更新 UI 的坏地方吗? * viewDidLayoutSubviews 将在视图的生命周期中被多次调用,例如方向更改或移入和移出另一个视图。
  • @3li 如果你打算更新组件框架,你不应该在viewDidLoad()这样做我建议检查this article,它很简单。
猜你喜欢
  • 1970-01-01
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多