viewDidAppear上的动画视图无法正常工作 - Swift

时间:2016-01-03 05:52:52

标签: ios swift animation uiview viewdidappear

我正在尝试从屏幕中心设置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上制作动画时应该使用的其他方法还是我还有其他错过的方法?< / p>

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

我还在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")
        })
    }
}

1 个答案:

答案 0 :(得分:4)

首先,当您在视图控制器子类中覆盖super.viewDidAppear(animated)时,需要调用viewDidAppear:

不幸的是,对于我来说这个视图控制器似乎工作正常,所以必须有其他东西继续...

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不同),因此您所做的更改几乎会立即被覆盖。您可以通过覆盖viewDidLayoutSubviews子类中的UIViewController并明确viewDidLoadviewWillAppear:viewDidAppear:viewDidLayoutSubviews来确认这一点,看看他们的订单是什么发生在。

要实现类似效果,您可以做的是使用dispatch_once块和once_token,这是您的类的属性,可以在viewDidLayoutSubviews中执行动画。这将确保在初始视图布局发生后,每个类的实例执行一次动画。 可能是您正在寻找的。

如果你可以提供更多的视图控制器代码或github链接,我可以给你一个更好的,更少潜在的hacky,回答正在发生的事情。