Swift:对图像进行拉伸和收缩动画处理



我试图在应用程序中的光剑的拉伸和收缩。目前,除了光剑的伸展/收缩外,我还有一切工作。

理想情况下,我希望能够将实际军刀的底部锚在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个或动画约束或删除它并使用框架属性进行动画,在这种情况下,您需要确保UIImageViewtranslatesAutoresizingMaskIntoConstraints = 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)
}

最新更新