2015-07-19 122 views
0

我一直在研究如何爲iOS應用程序創建配色方案。iOS應用程序的配色方案 - UIView和UIAppearance - 設置背景顏色

從故事板開始併爲每個組件手動設置背景顏色後,我很快意識到,雖然對於玩具應用程序來說,沒有問題,但對於任何更復雜的事情來說,這會既枯燥又耗時 - 特別是如果你想在未來再次改變所有的顏色。

這導致我找到UIAppearance協議,我想,作爲一個起點,如何只是在做這樣的事情:

[[UIView appearance] setBackgroundColor:[UIColor orangeColor]]; 

我在Xcode 6試驗和使用主從應用程序模板(目標-C)。結果並非我所期望的;我預計該應用看起來與之前一樣,但具有橙色背景。我實際上得到的是整個應用程序顯示爲橙色的單個全屏矩形,無法查看UI的實際元素。它看起來像前景和背景顏色都設置爲橙色,沒有區別(我會張貼我看到的圖像,但我目前沒有足夠的聲譽)。我也嘗試使用setTintColor,但這似乎影響的唯一UI元素是UITableView的「編輯」並添加其文本設置爲橙色的「+」按鈕。

我能夠通過設置以下以獲得基本上由「預期」的結果(在下面的代碼段DetailViewUIAppearanceTest是的UIView的未修改子類,我設置爲用於詳細視圖):

[[UITableView appearance] setBackgroundColor:[UIColor orangeColor]]; 
[[UITableViewCell appearance] setBackgroundColor:[UIColor orangeColor]]; 
[[UINavigationBar appearance] setBarTintColor:[UIColor orangeColor]]; 
[[DetailViewUIAppearanceTest appearance] setBackgroundColor:[UIColor orangeColor]]; 
[[UILabel appearance] setBackgroundColor:[UIColor orangeColor]]; 

我知道這並沒有太多的代碼,它允許對外觀進行更細緻的控制(只有堅實的橙色可能不是最好的外觀!),但它留下的東西我不明白,如果我不'不明白,那麼可能有未知的陷阱,所以我的問題是:

  1. 爲什麼不簡單地設置UIView的背景顏色實際上是爲所有視圖設置背景顏色(而不是使前景和背景同一)?
  2. 對於UINavigationBar,setBackgroundColor:似乎沒有效果,只有setBarTintColor:具有預期的結果。這種行爲似乎並不一致;有誰知道這是爲什麼?
  3. Bonus問題:是否有任何方法可以設置全班級的UITableViewCell的背景顏色?我遇到的唯一方法是實例屬性'selectedBackgroundView',一個選項是將其子類化並在指定的初始化程序中設置給定的顏色,但有沒有更好的方法?

正如你可能從這個問題可以告訴我,我是新的iOS開發;我的背景是服務器端C++,而且我正在與Objective-C合作,因爲它離我的舒適區更近一點,Swift似乎也是目前的移動目標。

回答

0

我也是相對較新的Objective-C發展,但讓我嘗試在這裏幫助你。

[[UIView appearance] setBackgroundColor:[UIColor orangeColor]]; 

這會導致整個屏幕變成橙色,因爲您正在屏幕上將每個視圖都設置爲橙色。屏幕上的所有東西都是UIView的一個子類 - 所以這意味着UITableViewUIScrollView等。這就是爲什麼您需要在調用setBackgroundColor和其他相關方法時更加細緻。

[[UINavigationBar appearance] setBarTintColor:[UIColor orangeColor]]; 

至於UINavigationBar,這是它的設計方式。根據文檔:barTintColortint color to apply to the navigation bar background.直接設置backgroundColor不會產生影響。這是元素設計的方式。也許別人可以給出更詳細的推理原因。

也要全局更改UITableViewCell我找到的最簡單的方法是繼承,並覆蓋setHighlightedsetSelectedselectedBackgroundView,如果您認爲合適的話。

如果你想覆蓋的高亮顏色以及所選擇的顏色(和支持動畫),我以前做的是:

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated 
{ 
    [super setHighlighted:highlighted animated:animated]; 

    NSTimeInterval duration = animated ? .25f : 0.f; 

    if (highlighted) 
    { 
     [self animateBackgroundTo:[UIColor orangeColor] duration:duration]; 
    } 
    else 
    { 
     [self animateBackgroundTo:[UIColor whiteColor] duration:duration]; 
    } 
} 

- (void)animateBackgroundTo:(UIColor *)backgroundColor duration:(NSTimeInterval)duration 
{ 
    [UIView animateKeyframesWithDuration:duration delay:0 options:UIViewKeyframeAnimationOptionAllowUserInteraction animations:^{ 
      self.backgroundColor = backgroundColor; 
     } completion:nil]; 
} 

如果你不想繼承UITableViewCell,只想改變其backgroundColor,您可以使用UIAppearance正因爲如此,這將改變backgroundColorcontentView子視圖UITableViewCell S的:

[[UIView appearanceWhenContainedIn:[UITableViewCell class], nil] setBackgroundColor:[UIColor orangeColor]]; 

你可以使用這個調用來昌e全球任何元素。它使您能夠更細緻地控制要更改的元素。例如包含在UIToolBar唯一當

[[UIBarButtonItem appearanceWhenContainedIn:[UIToolbar class], nil] setTintColor:[UIColor orangeColor]]; 

將改變欄按鈕項目的tintColor。包含在UIToolBar■當

[[UIBarButtonItem appearanceWhenContainedIn:[UIToolbar class], nil] setTitleTextAttributes:@{NSFontAttributeName:[UIFont boldSystemFontOfSize:16.f]} forState:UIControlStateNormal]; 

將改變欄按鈕項的字體。

編輯: tintColor財產是主題時,你的應用程序非常方便。您可以在任何視圖中使用它(從UIViewController的主視圖通過視圖層次結構向下傳遞)以設置任何元素的顏色。

例如,假設您有一個自定義UITableViewCell,您希望將其中一個標籤指定爲應用正在使用的任何色調顏色。所以,你重寫tintColorDidChange像這樣:

- (void)tintColorDidChange 
{ 
    [self.label setTextColor:self.tintColor]; 
} 

然後當你在UIViewController

self.view.tintColor = [UIColor orangeColor]; 

神奇設置,你的細胞現在有橙色的標籤! (您需要通過調用reloadData或類似方法重新繪製單元格)

至於setTintColor只更改UIBarButtonItem s。更改UINavigationBar上的tintColor也會更改所有子視圖中的tintColor,這意味着在這種情況下,UINavigationBarItem上的tintColor被更改,它們將其用作標題textColor

希望這會有所幫助。

+0

謝謝克里斯,你的回答幫助我解決了一些其他我着色過的實際問題。你指出能夠基於層次結構進行着色的部分特別有用,因爲當我在研究嵌入式UITableView時,無法一直獲得正確的顏色。 我不太確定的一件事仍然是背景顏色的UIView設置。我得到了幾乎所有從UIView繼承而來的設置,並且爲所有設置了背景顏色,但是我不明白爲什麼會隱藏以前可見的任何「前景」顏色。 – DragonTheHorse

+0

太棒了!樂意效勞。至於'UIView'問題。如果我正確閱讀,我認爲發生的事情又是所有的意見都將'backgroundColor'設置爲橙色。爲了澄清,我的意思是即使'UILabel'繼承自'UIView' - 所以即使他們的'backgroundColor'也會變成橙色。但是,如果你說即使'textColor'變成橙色,那也是奇怪的。我不確定爲什麼會這樣。也許如果你用前景色詳細說明你的意思,我可以幫助更多。 – Kris

+0

外觀就像'textColor'這樣的東西也被設置爲橙色,所以即使畫布上的標籤也是不可見的,因爲它們與背景顏色相同(並且在故事板中textColor是黑色的) 。這可能不是實際發生的事情,它只是看起來發生了什麼。也許在默認應用程序模板的前景中有一個通常是透明的全屏視圖 - 如果這樣,我當然可以理解,將其背景設置爲純橙將會蝕掉應用程序中的其他所有內容 – DragonTheHorse