当前位置: 首页 > 知识库问答 >
问题:

更改视图在viewDidLoad中的位置

严修谨
2023-03-14

应用程序启动时,我试图使用以下代码通过查看加载更改单独视图的位置:

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中工作。如果我使用iAction将to指定给按钮,代码就会工作

我猜我这里遗漏了什么,但我不知道是什么。

共有1个答案

融烨磊
2023-03-14

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

是的,我知道。我假设这与此有关?在viewddLoad之后加载约束吗?

没错,从viewddLoad()留档:

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

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

如果我没有搞错的话,您要查找的是viewDidLayoutSubviews()方法:

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

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

所以,与其在viewddLoad()中实现更改视图y位置的代码,不如尝试让它在viewddLayoutSubview()中,如下所示:

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
            })
        }
    }

附加说明:

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

 类似资料:
  • 我有一个非常令人沮丧的问题,我不知道是什么问题。我构建了只包含GridView的简单XML。这个gridview应该显示从特定的URL下载的图像(ImageView ),我用我的代码检索这些图像。 因此,此应用程序的想法只是从URL下载图像并在网格视图中显示这些图像。首先,我必须说我正在使用通用图像加载器库。首先,请看一下我的获取视图代码: 问题: 上面的代码有效,它在GridView中显示图像。

  • 我有一个具有2个视图\控制器的应用程序: 谢谢你。

  • 基本上,我有一个方法可以将Image从数据库加载到ImageView中,还有第二个方法可以更改图像,我成功地运行了这两个方法,没有出现异常,但是在change eImage()方法中的setImage之后,我需要更新什么以及如何(场景、阶段)是可能的。我知道在javafx中没有像swings中的repaint()这样的方法,那么我该如何处理呢?

  • 我知道有几个类似的主题,但我读了并尝试了其中的大部分,但仍然不知道如何做到这一点。 我写了一个组件在Joomla 2.5和它的工作到目前为止。我有不同的视图,我可以使用controller.php.其中一个视图显示了我的数据库(关于团队的数据)中的一个表。 现在我想有另一个相同视图的布局,它将数据基表显示为表单,以便可以更改内容。 这是文件结构: -团队/ ---tmpl/ - - - defau

  • 本文向大家介绍在SAP HANA中更改数据库视图,包括了在SAP HANA中更改数据库视图的使用技巧和注意事项,需要的朋友参考一下 您可以更改视图,然后我们可以使用“更改视图”命令来更改视图。 示例 我们已应用ALTER命令来更新名称为View_EmpInfo的现有视图,该视图正在对ID列的两个表应用内部联接以创建数据库视图。

  • 我正在Laravel5.1中创建一个应用程序,它以前工作得很好。我在视图文件中所做的任何更改都会反映在浏览器中。现在,在过去3天中,浏览器中未反映任何更改。 以下是我的视图文件: 主人刀身php 我正在将css文件的名称更改为app。但是当我运行应用程序时,它会显示main。源代码中的css。 我在storage/framework中查找了缓存,它显示了带有旧代码“main”的视图文件。css“我