4

私はウェブ上の良いチュートリアル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()たが、アニメの動作もちゃんと確認できました。

だから私の質問は次のとおりです。

  • どちらがより良い方法ですか?

  • これら 2 つのコードが同じように機能するのはなぜですか?

  • を削除するlayoutIfNeeded()と、アニメーションが機能しなくなりました。これは、ビューをすぐに強制的に更新しないと、アニメーション ブロックの後に次のビュー更新サイクルが発生し、アニメーションが無効になるためです。

4

1 に答える 1