Swift-单击按钮后重新启动动画

时间:2018-08-01 19:58:06

标签: ios swift

我希望有人能提供帮助。

我有两个在屏幕上移动的矩形。 (矩形)的第一个约束是在我的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
}

感谢您提供的任何帮助。

1 个答案:

答案 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()

在动画块内

当然,我不建议删除所有约束并再次构造它们,但是您可以参考要更改和更改其常数的约束,但是对于初学者来说,这样做可能很好