UIView 动画问题 swift 4 Xcode9
issues with UIView animation swift 4 Xcode9
我正在尝试使用 spring 动画块制作一个 UILabel
从屏幕外到中心的动画。下面 viewDidLoad()
中我的代码的第一部分工作得很好,但是当我添加动画块时,它就像动画闭包中的代码首先被读取并且它没有动画,因为标签已经在我希望标签动画的地方。我也试过将这个确切的代码放在 viewDidAppear()
中,但同样的事情发生了。
@IBOutlet weak var follow: UILabel!
@IBOutlet weak var followX: NSLayoutConstraint!
override func viewDidLoad() {
super.viewDidLoad()
self.follow.translatesAutoresizingMaskIntoConstraints = false
self.followX.constant = self.view.frame.width/2 + follow.frame.width/2
self.view.layoutIfNeeded()
UIView.animate(withDuration: 2, delay: 2, usingSpringWithDamping: 5, initialSpringVelocity: 5, options: .curveEaseOut, animations: {
self.followX.constant = 0
self.view.layoutIfNeeded()
})
}
这是正确的方法(尽管我会尝试将该动画移动到 viewWillAppear
或 viewDidAppear
):
@IBOutlet weak var follow: UILabel!
@IBOutlet weak var followX: NSLayoutConstraint!
override func viewDidLoad() {
super.viewDidLoad()
self.follow.translatesAutoresizingMaskIntoConstraints = false
self.followX.constant = self.view.frame.width/2 + follow.frame.width/2
self.view.layoutIfNeeded()
self.followX.constant = 0
self.view.setNeedsLayout()
UIView.animate(withDuration: 2, delay: 2, usingSpringWithDamping: 5, initialSpringVelocity: 5, options: .curveEaseOut, animations: {
self.view.layoutIfNeeded()
})
}
要使用自动布局:
您首先要确保开始动画已准备就绪:
self.followX.constant = self.view.frame.width/2 + follow.frame.width/2
self.view.layoutIfNeeded()
然后你改变约束到动画的最终状态:
self.followX.constant = 0
然后告诉自动布局约束已更改:
self.view.setNeedsLayout()
最后你用 layoutIfNeeded()
调用 UIView.animate
来动画变化:
UIView.animate(withDuration: 2, delay: 2, usingSpringWithDamping: 5, initialSpringVelocity: 5, options: .curveEaseOut, animations: {
self.view.layoutIfNeeded()
})
override func viewDidLayoutSubviews() {
if(once)
{
once = false
self.follow.translatesAutoresizingMaskIntoConstraints = false
self.followX.constant = self.view.frame.width/2 + follow.frame.width/2
self.view.layoutIfNeeded()
}
}
并且在 viewDidAppear 中
override func viewDidAppear() {
self.followX.constant = 0
UIView.animate(withDuration: 2, delay: 0, usingSpringWithDamping: 5, initialSpringVelocity: 5, options: .curveEaseOut, animations: {
self.view.layoutIfNeeded()
})
}
我正在尝试使用 spring 动画块制作一个 UILabel
从屏幕外到中心的动画。下面 viewDidLoad()
中我的代码的第一部分工作得很好,但是当我添加动画块时,它就像动画闭包中的代码首先被读取并且它没有动画,因为标签已经在我希望标签动画的地方。我也试过将这个确切的代码放在 viewDidAppear()
中,但同样的事情发生了。
@IBOutlet weak var follow: UILabel!
@IBOutlet weak var followX: NSLayoutConstraint!
override func viewDidLoad() {
super.viewDidLoad()
self.follow.translatesAutoresizingMaskIntoConstraints = false
self.followX.constant = self.view.frame.width/2 + follow.frame.width/2
self.view.layoutIfNeeded()
UIView.animate(withDuration: 2, delay: 2, usingSpringWithDamping: 5, initialSpringVelocity: 5, options: .curveEaseOut, animations: {
self.followX.constant = 0
self.view.layoutIfNeeded()
})
}
这是正确的方法(尽管我会尝试将该动画移动到 viewWillAppear
或 viewDidAppear
):
@IBOutlet weak var follow: UILabel!
@IBOutlet weak var followX: NSLayoutConstraint!
override func viewDidLoad() {
super.viewDidLoad()
self.follow.translatesAutoresizingMaskIntoConstraints = false
self.followX.constant = self.view.frame.width/2 + follow.frame.width/2
self.view.layoutIfNeeded()
self.followX.constant = 0
self.view.setNeedsLayout()
UIView.animate(withDuration: 2, delay: 2, usingSpringWithDamping: 5, initialSpringVelocity: 5, options: .curveEaseOut, animations: {
self.view.layoutIfNeeded()
})
}
要使用自动布局:
您首先要确保开始动画已准备就绪:
self.followX.constant = self.view.frame.width/2 + follow.frame.width/2 self.view.layoutIfNeeded()
然后你改变约束到动画的最终状态:
self.followX.constant = 0
然后告诉自动布局约束已更改:
self.view.setNeedsLayout()
最后你用
layoutIfNeeded()
调用UIView.animate
来动画变化:UIView.animate(withDuration: 2, delay: 2, usingSpringWithDamping: 5, initialSpringVelocity: 5, options: .curveEaseOut, animations: { self.view.layoutIfNeeded() })
override func viewDidLayoutSubviews() {
if(once)
{
once = false
self.follow.translatesAutoresizingMaskIntoConstraints = false
self.followX.constant = self.view.frame.width/2 + follow.frame.width/2
self.view.layoutIfNeeded()
}
}
并且在 viewDidAppear 中
override func viewDidAppear() {
self.followX.constant = 0
UIView.animate(withDuration: 2, delay: 0, usingSpringWithDamping: 5, initialSpringVelocity: 5, options: .curveEaseOut, animations: {
self.view.layoutIfNeeded()
})
}