gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 11:52:43 26 4
gpt4 key购买 nike

我希望有人能提供帮助。

我有两个在屏幕上移动的矩形。 (矩形)的第一个约束在我的 setupViews 函数中激活,该函数在我的 viewDidLoad 中调用。

在我的 viewDidLayoutSubviews 中,我有一个动画函数,称为移动两个矩形。

但是,当我单击一个按钮时,我希望矩形返回到它们的初始位置并从头开始播放动画。

我怎样才能成功做到这一点?

我最初没有在我的 viewDidLayoutSubviews 中调用我的动画,只是在另一个函数中(在我的 viewDidAppear(_ animated: 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- 首先动画不应该在 viewDidLayoutSubviews 里面,因为它被调用了很多次,最好的地方是 viewDidAppear

2- 您没有为 backgroundImageView 设置任何约束

3- 要为 child 设置动画,请移除其自身及其父级的约束

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

在动画 block 中

当然我不建议删除所有约束并重新构造它们,但是您可以引用要更改的约束并更改它们的常量,但对于初学者来说这可能是个不错的选择

关于ios - Swift - 单击按钮后重新启动动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51641385/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com