ios - viewDidAppear 上的动画 View 无法正常工作 - Swift

标签 ios swift animation uiview viewdidappear

我正在尝试让一个 view 从屏幕中心开始动画,在加载 View 1 秒后离开屏幕。

我遇到的问题是,在加载时 view 处于原始(正确)位置一毫秒后,它会捕捉到新位置并动画回到原始位置。

我在 viewDidLoad 中有以下代码

override func viewDidAppear(animated: Bool) {

    UIView.animateWithDuration(0.7, delay: 1, options: .CurveEaseOut, animations: {
        var loadingViewFrame = self.loadingView.frame
        loadingViewFrame.origin.y += 600

        self.loadingView.frame = loadingViewFrame
        }, completion: { finished in
            print("moved")
    })


}

我已经尝试将此代码放入 button 操作中并且它工作正常,那么在 viewWillAppear 上设置动画时我应该使用其他方法还是有什么东西否则我错过了吗?

我已经删除了所有自动布局约束,因为我读到它们可能会导致一些问题。

我在 viewDidAppear 以及 viewWillAppearviewDidLoad 中还有其他代码,如果您认为它有用,我可以在这里展示,但是我已经注释掉所有这些代码,只留下基本代码,但仍然出现同样的错误。

非常感谢您的帮助。


编辑 1

我已将代码移至 viewDidLayoutSubviews 并使用了 dispatch_once 以确保只执行一次。图像仍然从新位置动画到原始位置,但现在图像在加载后一毫秒内不在原始位置。

这是我添加的代码

    var token: dispatch_once_t = 0

override func viewDidLayoutSubviews() {
    dispatch_once(&token) {

        UIView.animateWithDuration(0.7, delay: 1, options: .CurveEaseOut, animations: {
            var loadingViewFrame = self.loadingView.frame
            loadingViewFrame.origin.x += 600

            self.loadingView.frame = loadingViewFrame
            }, completion: { finished in
                print("moved")
        })
    }
}

最佳答案

首先,当您在 View Controller 子类中覆盖 viewDidAppear: 时,您需要调用 super.viewDidAppear(animated)

不幸的是,这个 View Controller 对我来说似乎工作得很好,所以一定有其他事情发生了......

class ViewController: UITableViewController {
    var loadingView: UIView!

    override func viewDidLoad() {
            super.viewDidLoad()

        loadingView = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
        loadingView.backgroundColor = UIColor.redColor()
        loadingView.center = view.center
        view.addSubview(loadingView)
    }

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

        UIView.animateWithDuration(0.7, delay: 1, options: .CurveEaseOut, animations: {
            var loadingViewFrame = self.loadingView.frame
            loadingViewFrame.origin.y += 600

            self.loadingView.frame = loadingViewFrame
        }, completion: nil)
    }
}

您的问题很可能是因为 layoutSubviews 可能在 viewDidAppear: 之后被调用(我相信这对于 iOS 8 和 iOS 9 是不同的)所以您所做的更改得到几乎立即被覆盖。您可以通过覆盖 UIViewController 子类中的 viewDidLayoutSubviews 和断点 viewDidLoadviewWillAppear:viewDidAppear 来确认这一点:viewDidLayoutSubviews 查看它们发生的顺序。

为了达到类似的效果,您可以做的一件事是使用带有 once_tokendispatch_once block ,这是您的类的一个属性,以在 中执行动画viewDidLayoutSubviews。这将确保您的动画在初始 View 布局发生后对每个类实例执行一次。这可能就是您正在寻找的。

如果您可以提供更多的 View Controller 代码或 github 链接,我也许可以为您提供一个更好的、不太可能骇人听闻的关于正在发生的事情的答案。

关于ios - viewDidAppear 上的动画 View 无法正常工作 - Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34573782/

相关文章:

ios - 如何在 Instagram 等应用中使用 "@"提及用户

ios - 如何从 3rd 方 node.js 服务器验证游戏中心用户

ios - 在 TableView 中显示结构数组

ios - 如何使用仅适用于 iOS 14+ 且部署目标为 iOS 13 的 View 修饰符

swift - 为什么单击取消按钮后 TableView 不重置结果?

ios - Swift/Math - 缩放时保持原点

ios - 如何在 iOS 图表的左 Axis 上添加字符串?

android - 将 null 传递给 setInterpolator 崩溃

r - 非常困惑如何合并两个图像来创建 gif

javascript - CSS3动画完成后重新加载javascript