我希望有人能提供帮助。
我有两个在屏幕上移动的矩形。 (矩形)的第一个约束是在我的setupViews函数中激活的,该函数在viewDidLoad中调用。
在我的viewDidLayoutSubviews中,我有一个动画功能,称为移动两个矩形。
但是,当我单击按钮时,我希望矩形返回其初始位置并从头开始动画。
我如何成功做到这一点?
最初,我没有在viewDidLayoutSubviews中调用我的动画,只是在另一个函数中调用了该动画(在我的viewDidAppear(_ animation:Bool)中被调用),但是,在阅读时似乎好像在viewDidLayoutSubviews中调用了动画可能是最好的选择。
我可以成功地停止动画,但是要使动画从其初始起点重新开始确实很麻烦。
我尝试再次在按钮发送器功能中创建约束。但这似乎无济于事,因为我不确定您可以更改元素约束而无需再次重新加载viewDidLoad。
下面是我的代码…………
override func viewDidLoad() {
super.viewDidLoad()
setupViews()
}
func setupViews() {
self.view.addSubview(backgroundImageView)
self.backgroundImageView.addSubview(contentView)
self.backgroundImageView.addSubview(slideDownTintedWhiteView)
self.backgroundImageView.addSubview(restartSlidingAnimation)
self.contentView.snp.makeConstraints { (make) in
make.edges.equalToSuperview()
}
self.slideDownTintedWhiteView.snp.makeConstraints { (make) in
make.top.equalToSuperview()
make.leading.equalToSuperview()
make.trailing.equalToSuperview()
make.bottom.equalTo(backgroundImageView.snp.top)
}
self.restartSlidingAnimation.snp.makeConstraints { (make) in
make.centerX.equalToSuperview()
make..centerY.equalToSuperview()
make.width.equalTo(10)
make.height.equalTo(10)
}
self.restartSlidingAnimation.addTarget(self, action: #selector(restartAnimationFunction(_:)), for: .touchUpInside)
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
UIView.animate(withDuration: 10, delay: 0, animations: {
//Red View:
self.contentView.frame = CGRect(x: self.contentView.frame.origin.x, y: self.contentView.frame.height, width: self.contentView.frame.width, height: self.contentView.frame.height)
//White View:
self.slideDownTintedWhiteView.frame = CGRect(x: self.contentView.frame.origin.x, y: 0, width: self.contentView.frame.width, height: self.contentView.frame.height)
}, completion: nil)
}
restartAnimationFunction() {
// Here is obviously where I need to somehow re-establish the constraints of the rectangles back to their original location or somehow start the animation from the beginning.
}
func stopContentViewAnimation() {
// This is where I am able to stop the animation (called from another button)
pausedTime = self.contentView.layer.convertTime(CACurrentMediaTime(), from: nil)
self.contentView.layer.speed = 0.0
self.contentView.layer.timeOffset = pausedTime
pausedTime = self.slideDownTintedWhiteView.layer.convertTime(CACurrentMediaTime(), from: nil)
self.slideDownTintedWhiteView.layer.speed = 0.0
self.slideDownTintedWhiteView.layer.timeOffset = pausedTime
}
感谢您提供的任何帮助。
答案 0 :(得分:2)
1-首先,动画不应被放在viewDidLayoutSubviews
内,因为它被多次调用,最佳位置是viewDidAppear
2-您没有为backgroundImageView
设置任何约束
3-要为孩子添加动画,请从其自身及其父对象中移除其约束
self.backgroundImageView.removeConstraints(self.backgroundImageView.constraints)
self.contentView.removeConstraints(self.contentView.constraints)
self.slideDownTintedWhiteView.removeConstraints(self.slideDownTintedWhiteView.constraints)
self.restartSlidingAnimation.removeConstraints(self.restartSlidingAnimation.constraints)
4-重新构造其他大小写约束,并准备好动画放置
self.view.layoutIfNeeded()
在动画块内
当然,我不建议删除所有约束并再次构造它们,但是您可以参考要更改和更改其常数的约束,但是对于初学者来说,这样做可能很好