2015-10-14 47 views
0

如果我執行UIView.appearance().tintColor = ...,則標籤欄中所有圖標的tintColor從正常非活動灰色狀態變爲任何設置爲淺色的顏色。如何通過更改所有UITabBar圖標顏色來防止使用UIAiew的UIAiew的tintColor?

我不明白爲什麼會出現這種情況。我只是改變應用程序的色調,默認情況下,色調不會讓所有標籤欄圖標立即顯示爲活動狀態。

如何阻止它這樣做?我想要改變色調顏色,但未選中的選項卡會保留不活動的顏色。

回答

0

當你說你「改變應用程序的色彩顏色」時,你是什麼意思?

UIView外觀代理正在執行您告訴它的內容。您要求它在您的應用中設置所有UIViewtintColor,其中包括您的UITabBar中的那些視圖。

這聽起來像你並不想改變所有UIViewtintColor,而是想要定位一個特定的子集。您應該查看appearanceForTraitCollection或(現在已棄用的)appearanceWhenContainedIn方法。

+0

不,當我使用故事板檢查器設置所有視圖的外觀時,它不會將未選定的UITabBarItems設置爲灰色。我只是希望它設置活動的,因爲默認的應用程序行爲。 –

+0

我不清楚你想要完成什麼。你應該發佈一些代碼。 – Nick

+0

原始帖子中的代碼是重現此操作所需的唯一代碼。默認情況下,iOS將全局色調設置爲藍色。到處都是藍色活動狀態。當您有選項卡欄時,圖標在選中時爲藍色,未選中時爲無效灰色。我想改變這種行爲,比如紅色。我的印象是使用原始問題中的代碼,但它也設置了標籤欄的未選定狀態,而默認行爲不會。我的問題是如何防止這種情況? –

1

我希望你現在已經找到了解決方案,但這裏是我的兩分錢。

Interface Builder不在任何地方使用UIAppearance API(據我所知)。但是,它確實在某些對象上設置了屬性,並在實例化時應用它們。

File Inspector中有一個「Global Tint」屬性,用於控制頂級默認值tintColor。值得注意的是,除非明確告知使用不同的顏色(無論是通過UIView.appearance()還是僅僅是UIView.tintColor),否則子視圖將繼承其父視圖的tintColor。請記住,這個鏈繼續貫穿視圖層次結構,直到它碰到一個有tintColor的東西。通常情況下,它最終會擊中UIWindow,並且具有Apple非常喜歡的默認藍色。任何變暗或暫時重新着色的狀態都是從視圖本身或親密的祖先繼承而來。這一點很重要。

同樣值得注意的是,您可以通過覆蓋tintColorChanged()方法來響應此問題,該方法在發生這種情況時會被調用。通過與UIView.appearance()混淆,您可以有效地禁用層次結構中每個視圖的繼承鏈,並且讓每個視圖都爲自己尋找自己的顏色。在我看來,至少有兩種方法可能會阻止UITabBar正確表示選項卡的狀態:

首先,選項卡欄底部有一個有色圖像視圖,它從父級UITabBar繼承它們的色調顏色。即使他們可以從標籤欄獲得特定於國家的顏色,這個可憐的東西也不會有任何不同的東西告訴他們,除了「」你給了一種顏色,你會尊重這種顏色!「,然後一巴掌和一聲鞭,,此時他們會反悔,不知道比以前更多。通過禁用分層繼承系統,可以禁用狀態。這不好。不要這樣做。

其次,通過設置色調顏色UIView無論狀態的,你告訴標籤欄項目來保存彩色無論狀態的。這不好。不要那樣做。

如果您使用Interface Builder(或者如果您喜歡使用Storyboard),我建議在文件檢查器中設置該全局色調顏色,然後將其保留。這仍然會以你想要的方式設定你的色調,同時將這些不良的觀點從家庭虐待中拯救出來。

如果您需要在哪裏找到文件檢查器或全局色調選項的屏幕截圖,我會建議在Xcode右側的邊欄上打圈。一點點刺激從未傷害任何人(電影除外)。

相關問題