我试图在应用程序中的光剑的拉伸和收缩。目前,除了光剑的伸展/收缩外,我还有一切工作。
理想情况下,我希望能够将实际军刀的底部锚在Saber手柄的顶部锚点下方。我能够在自动布局约束方面取得一定的成就。但是,我正在努力寻找正确的动画代码。从我的代码中可以看到,我尝试了框架。Size.height/width,但是只会移动Saber的框架(而不是句柄(。size.size.height的行可以实现我想要的伸展/成长,但这是一种非常盗版的方式。
当前的框架size.height/width方法仅移动图像,我将如何实现伸展/收缩能力?是否可以通过自动布局约束的乘数函数实现它?
@objc func lightsaberTapped() {
print("lightsaber open!")
if mainView.saberImage.isHidden == true {
mainView.saberImage.isHidden = false
UIView.animate(withDuration: 0.5, animations: {
self.mainView.saberImage.frame.size.height -= 500
// self.mainView.saberImage.frame.size.width += 20
}, completion: nil)
lightsaberModel.turnSaberOnAudio.play()
} else {
mainView.saberImage.isHidden = true
UIView.animate(withDuration: 0.5, animations: {
self.mainView.saberImage.frame.size.height += 500
// self.mainView.saberImage.frame.size.width += 20
}, completion: nil)
}
}
您的主要问题是框架动画,在有约束时,您需要1个或动画约束或删除它并使用框架属性进行动画,在这种情况下,您需要确保UIImageView
与translatesAutoresizingMaskIntoConstraints = false
要在Autolayout
系统中进行动画宽度和高度,您需要将约束参考作为IBOutlet
获取并在动画块内部动画恒定属性,
这是一个很小的示例
class ViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var imageHeightConstraint: NSLayoutConstraint!
@IBOutlet weak var imageWidthConstraint: NSLayoutConstraint!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
}
@IBAction func action(_ sender: Any) {
UIView.animate(withDuration: 0.5, animations: {
self.imageHeightConstraint.constant = self.imageHeightConstraint.constant - 10
self.imageWidthConstraint.constant = self.imageWidthConstraint.constant - 10
self.view.layoutIfNeeded()
})
}
}
首先添加宽度和高度的约束
@IBOutlet weak var saberImageHeightConstraint: NSLayoutConstraint!
@IBOutlet weak var saberImageWidthConstraint: NSLayoutConstraint!
尝试在调整帧大小时获取动画。
if mainView.saberImage.isHidden == true
{
mainView.saberImage.isHidden = false
self.saberImageHeightConstraint.constant -= 500
UIView.animate(withDuration: 0.5, animations: {
self.view.layoutIfNeeded()
self.viewDidLayoutSubviews()
}, completion: nil)
lightsaberModel.turnSaberOnAudio.play()
}
else
{
mainView.saberImage.isHidden = true
self.saberImageHeightConstraint.constant += 500
UIView.animate(withDuration: 0.5, animations: {
self.view.layoutIfNeeded()
self.viewDidLayoutSubviews()
}, completion: nil)
}