簡體   English   中英

動畫無法快速運行

[英]Animation not working in swift

我在鍵盤輸入視圖中有一個按鈕和一個集合視圖(水平)。 使用自動布局。 默認情況下,使用“領先約束”設置為-50隱藏該按鈕。 當用戶開始使用集合視圖並且集合視圖的contentOffset.x大於80時,將顯示按鈕。 該代碼可以正常工作,但是動畫不起作用。

extension ViewController: UIScrollViewDelegate {
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if self.collectionView.contentOffset.x > 80 {
            UIView.animate(withDuration: 1, delay: 0, options: .curveEaseIn, animations: {
                self.sideButtonLeadingConstraint.constant = 0
                self.view.layoutIfNeeded()
            }, completion: nil)
        } else {
            UIView.animate(withDuration: 1, delay: 0, options: .curveEaseIn, animations: {
                self.sideButtonLeadingConstraint.constant = -50
                self.view.layoutIfNeeded()
            }, completion: nil)
        }
    }
}

通過更新動畫塊外部的常量,嘗試進行以下操作。 它將使用動畫效果進行更新。

extension ViewController: UIScrollViewDelegate {
func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if self.collectionView.contentOffset.x > 80 {
        self.sideButtonLeadingConstraint.constant = 0
        UIView.animate(withDuration: 1, delay: 0, options: .curveEaseIn, animations: {
            self.view.layoutIfNeeded()
        }, completion: nil)
    }
    else {
        self.sideButtonLeadingConstraint.constant = -50
        UIView.animate(withDuration: 1, delay: 0, options: .curveEaseIn, animations: {
            self.view.layoutIfNeeded()
        }, completion: nil)
    }
}}

首先,您不應在動畫塊內更改約束。 其次, scrollViewDidScroll方法被調用了很多次,您應該為在其中調用動畫代碼設置一些限制。 嘗試這樣的事情:

extension ViewController: UIScrollViewDelegate {
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        let needsShow = collectionView.contentOffset.x > 80 && sideButtonLeadingConstraint.constant != 0
        let needsHide = collectionView.contentOffset.x <= 80 && sideButtonLeadingConstraint.constant != -50

        if needsShow {
            sideButtonLeadingConstraint.constant = 0                
        } else if needsHide {
            sideButtonLeadingConstraint.constant = -50
        }

        if needsShow || needsHide {
            UIView.animate(withDuration: 1, delay: 0, options: .curveEaseIn, animations: {
                self.view.layoutIfNeeded()
            }, completion: nil)
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM