我正在尝试从屏幕中心设置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
以及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")
})
}
}
答案 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
并明确viewDidLoad
,viewWillAppear:
,viewDidAppear:
和viewDidLayoutSubviews
来确认这一点,看看他们的订单是什么发生在。
要实现类似效果,您可以做的是使用dispatch_once
块和once_token
,这是您的类的属性,可以在viewDidLayoutSubviews
中执行动画。这将确保在初始视图布局发生后,每个类的实例执行一次动画。 可能是您正在寻找的。 p>
如果你可以提供更多的视图控制器代码或github链接,我可以给你一个更好的,更少潜在的hacky,回答正在发生的事情。