我正在尝试让一个 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
以及 viewWillAppear
和 viewDidLoad
中还有其他代码,如果您认为它有用,我可以在这里展示,但是我已经注释掉所有这些代码,只留下基本代码,但仍然出现同样的错误。
非常感谢您的帮助。
编辑 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
和断点 viewDidLoad
、viewWillAppear:
、viewDidAppear 来确认这一点:
和 viewDidLayoutSubviews
查看它们发生的顺序。
为了达到类似的效果,您可以做的一件事是使用带有 once_token
的 dispatch_once
block ,这是您的类的一个属性,以在 中执行动画viewDidLayoutSubviews
。这将确保您的动画在初始 View 布局发生后对每个类实例执行一次。这可能就是您正在寻找的。p>
如果您可以提供更多的 View Controller 代码或 github 链接,我也许可以为您提供一个更好的、不太可能骇人听闻的关于正在发生的事情的答案。
关于ios - viewDidAppear 上的动画 View 无法正常工作 - Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34573782/