我正在学习如何使用 UIStackView
,并阅读了网上的一篇好的教程。在教程中,作者编写了以下代码以进行动画操作:
@IBAction func addStar(sender: AnyObject) {
let starImgVw:UIImageView = UIImageView(image: UIImage(named: "star"))
starImgVw.contentMode = .ScaleAspectFit
self.horizontalStackView.addArrangedSubview(starImgVw)
UIView.animateWithDuration(0.25, animations: {
self.horizontalStackView.layoutIfNeeded()
})
}
然而,当我克隆仓库并稍微修改代码后,我仍然可以正确地看到相同的动画。
@IBAction func addStar(sender: AnyObject) {
let starImgVw:UIImageView = UIImageView(image: UIImage(named: "star"))
starImgVw.contentMode = .ScaleAspectFit
UIView.animateWithDuration(0.25, animations: {
self.horizontalStackView.addArrangedSubview(starImgVw)
self.horizontalStackView.layoutIfNeeded()
})
}
我将 self.horizontalStackView.addArrangedSubview(starImgVw)
移动到了动画块的内部。
我还尝试在 removeStar
函数上做同样的事情;这次我移动了 self.horizontalStackView.removeArrangedSubview(aStar)
和 aStar.removeFromSuperview()
,但是我也确认了动画正常工作。
所以我的问题如下:
哪种方式更好?
为什么这两个代码以相同的方式工作?
当我删除
layoutIfNeeded()
时,动画就不起作用了。这是因为如果我不立即强制更新视图,则下一个视图更新周期发生在动画块之后,因此动画不再有效,对吗?