簡體   English   中英

將自動布局與核心動畫相結合

[英]Combining autolayout with core animation

我是核心動畫的新手,我正在努力解決一件事 - 如何將autolayout與核心動畫結合起來。 實際上我在Core Animation的文檔中只找到了一個句子,這里引用的是Autolayout

記住將視圖約束更新為動畫的一部分如果使用基於約束的布局規則來管理視圖的位置,則必須刪除可能會影響動畫的任何約束,作為配置動畫的一部分。 約束會影響您對視圖的位置或大小所做的任何更改。 它們還會影響視圖與其子視圖之間的關系。 如果要為這些項中的任何項設置動畫,則可以刪除約束,進行更改,然后應用所需的任何新約束。

但是,正如我所做的那樣,所有人並不像看起來那樣直截了當。 這是我的情景。

我設計了一個廣泛使用自動布局的滑動菜單。 這是該視圖的外觀。 在此輸入圖像描述

我正在使用自動布局約束來強制在滑動菜單中按比例定位這些項目。 實際上有很多限制,我不想在我的問題中發布所有這些,甚至可能是他們不需要直接回答這個問題,但是如果你需要它們我可以用那些更新帖子限制。

您在gif中看到的動畫僅通過autolayout到達。 我只是添加了插入滑動菜單的高度限制並以這種方式更改它:(代碼是使用Xamarin Monotouch編寫的,但我相信它應該很清楚這里為純iOS開發人員做了什么)

private void AnimateSlideMenuAppearance()
    {
        float height;
        if (isSlideMenuShown) {
            height = 0;
        } else {
            height = slideMenuHeight;
        }
        UIView.Animate (0.4,
            delegate {
                this.slideMenuHeightConstraint.Constant = height;
                this.View.LayoutIfNeeded ();
            }, 
            delegate {
                isSlideMenuShown = !isSlideMenuShown;
            });
    }

現在我希望獲得更復雜的外觀過渡。 點擊這里查看我想要達到的效果。

只是為了嘗試我嘗試使用CABasicAnimation系列實現該動畫的消失部分,但它不成功,我得到了奇怪的行為。

任何人都可以建議我應該在這做什么嗎? 是否可以使用autolayout來計算視圖的位置,但以某種方式覆蓋自動布局大小更改之間的動畫? 我的意思是在我的具體例子中,而不是按比例減少菜單中所有按鈕的大小,我需要向它們添加FadeOut動畫,將邊界設置為零動畫,並從按鈕到按鈕從根本上增加動畫的開始時間以獲得效果我想要的。 或者我可能需要完全擺脫autolayout並手動計算大小和動畫?

這種情況下的最佳做法是什么 - 當您有復雜的自動布局時,您需要在自動布局更改之間進行自定義核心動畫轉換? 我希望我能很好地描述這個問題。 謝謝您的回答。

這是完全可行的,雖然它可能很復雜,因為它看起來像你想要的案例將有多個動畫。

但是,我注意到你的代碼中有一件事是奇怪的:你動畫塊中改變約束( this.slideMenuHeightConstraint.Constant = height )的常量,而不是在它之前。 對於我能想象的幾乎所有情況,你應該在動畫塊之前改變約束。 在下一個UI運行循環(或通過setNeedsUpdateConstraints強制它用於下一個運行循環)之前,或者通過layoutIfNeeded立即呈現約束。 因為[UIView animate:...]正在為你做這個,所以在動畫自動布局時, layoutIfNeeded應該(通常)是動畫塊中的唯一內容。

在你的情況下,你將不得不使動畫有點反應 - 例如,如果你想在示例中添加這些按鈕並讓它們彈出,動畫,並增長。 調用layoutIfNeeded ,您可以安全地檢查幀大小。 如果它超出了您的閾值(或其他某個指標),您可以觸發按鈕的動畫。 (所以是的,這可能是我在動畫塊中添加更多代碼的情況 - 檢查閾值,開始其他動畫等)。

暫無
暫無

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

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