成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Swift主題色頂級解決方案

移動開發 iOS
主題色的設置點,大體從上面四個方面著手,圖片的主題色我們可通過圖片更換的方式進行處理。而通過代碼來處理的 1-3 條,有著不同的處理方法。

一、常規主題色使用點

應用在發布前都會對主題色進行設置,以統一應用的風格(可能有多套主題)。在主題色設置上有幾個方面,如下:

1. TabBar部分,設置圖片高亮、文本高度顏色

2. NavigationBar部分,設置導航欄顏色及字體顏色

3. 應用標簽等,設置字體的顏色

4. 應用圖片主題色

主題色的設置點,大體從上面四個方面著手,圖片的主題色我們可通過圖片更換的方式進行處理。而通過代碼來處理的 1-3 條,有著不同的處理方法。大家常規處理方法如下:

步驟一:變化分離

1. 利用Swift擴展語法擴展UIColor,將應用主題色在擴展中統一處理(適合單一主題色)

2. 將主題色的配置寫入文件中,由相應邏輯進行解析。此方法將主題色邏輯封裝成主題色管理類(適合多套主題)

步驟二:離散使用上步封裝的類

1.在任何使用主題色的地方,使用擴展中的UIColor方法來設置,一般包括背景色,文字顏色等

這里給出UIColor的擴展

  1. extension UIColor { 
  2.   
  3.     //主題色 
  4.     class func applicationMainColor() -> UIColor { 
  5.         return UIColor(red: 238/255, green: 64/255, blue: 86/255, alpha:1
  6.     } 
  7.   
  8.     //第二主題色 
  9.     class func applicationSecondColor() -> UIColor { 
  10.         return UIColor.lightGrayColor() 
  11.     } 
  12.   
  13.     //警告顏色 
  14.     class func applicationWarningColor() -> UIColor { 
  15.         return UIColor(red: 0.1, green: 1, blue: 0, alpha: 1
  16.     } 
  17.   
  18.     //鏈接顏色 
  19.     class func applicationLinkColor() -> UIColor { 
  20.         return UIColor(red: 59/255, green: 89/255, blue: 152/255, alpha:1
  21.     } 
  22.   

二、TabBar主題色設置

很多應用中,默認情況下都使用了TabBar控件,但是TabBar主題色等設置根據使用情況的不同,設置起來也不一樣。代碼創建比較靈活,更改主題色比較容易。而使用了Xib/Storyboard也是有辦法做統一處理的,如下,迭代更改TabBar默認字體顏色

  1. func configTabBar() { 
  2.        let items = self.tabBar.items 
  3.        for item in items as [UITabBarItem] { 
  4.            let dic = NSDictionary(object: UIColor.applicationMainColor(), 
  5.             forKey:   NSForegroundColorAttributeName) 
  6.            item.setTitleTextAttributes(dic, 
  7.             forState: UIControlState.Selected) 
  8.        } 
  9.    } 

設置TabBar圖片及文字默認選中顏色

self.tabBar.selectedImageTintColor = UIColor.applicationMainColor()

Tips注意事項

Changing this property’s value provides visual feedback in the user interface, including the running of any associated animations. The selected item displays the tab bar item’s selectedImage image, using the tab bar’s selectedImageTintColor value. To prevent system coloring of an item, provide images using the UIImageRenderingModeAlwaysOriginal rendering mode.

在一些情況,正常狀態為白色圖片時,真機測試時,白色圖片會出現偏色(顯示結果為灰色),這是因為系統默認著色導致的,在創建UITabBarItem時,可通過使用UIImageRenderingModeAlwaysOriginal避免。示例代碼如下:

  1. let imageNormal = UIImage(contentsOfFile: "imageNormal")?. 
  2. imageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal) 
  3. let imageSelected = UIImage(contentsOfFile: "imageSelected"
  4. let tabBarItem = UITabBarItem(title: "title"
  5.          image: imageNormal, 
  6.          selectedImage: imageSelected 

三、一勞永逸,利用Hook原理通設NavigationBar顏色

iOS應用中,NavigationBar十分常用,它的使用主要包括以下兩個場景

1. 代碼直接構建

2. Xib/Storyboard構建

如果是純代碼構建的時候,比較簡單,直接使用UIColor的擴展來設置顏色。實際項目中,有些界面是通過Xib/Storyboard來創建的,有些是代碼寫的,但這也難不到大家,使用繼承。創建一個繼承自UINavigationController的子類,通過這個子類來統一設置主題色。然后告訴項目中的所有人,強制使用UINavigationController子類,包括Xib/Storyboard等。問題是舊項目怎么辦,這種強制要求可以工作,有沒有一個更好的辦法,讓所有人正常使用UINavigationController,而在神不知鬼不覺的情況下,通設所有NavigationBar呢? 先上代碼,再解釋

1.創建一個UIViewController的擴展

  1. extension UIViewController { 
  2.     func viewDidLoadForChangeTitleColor() { 
  3.         self.viewDidLoadForChangeTitleColor() 
  4.         if self.isKindOfClass(UINavigationController.classForCoder()) { 
  5.            self.changeNavigationBarTextColor(self as UINavigationController) 
  6.         } 
  7.     } 
  8.   
  9.     func changeNavigationBarTextColor(navController: UINavigationController) { 
  10.         let nav = navController as UINavigationController 
  11.         let dic = NSDictionary(object: UIColor.applicationMainColor(), 
  12.          forKey:NSForegroundColorAttributeName) 
  13.         nav.navigationBar.titleTextAttributes = dic 
  14.         nav.navigationBar.barTintColor = UIColor.applicationSecondColor() 
  15.         nav.navigationBar.tintColor = UIColor.applicationMainColor() 
  16.   
  17.     } 
  18.   

2. 編寫用于Hook的工具類

  1. func swizzlingMethod(clzz: AnyClass, #oldSelector: Selector, #newSelector: Selector) { 
  2.     let oldMethod = class_getInstanceMethod(clzz, oldSelector) 
  3.     let newMethod = class_getInstanceMethod(clzz, newSelector) 
  4.     method_exchangeImplementations(oldMethod, newMethod) 

3. 在AppDelegate中調用

  1. func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool { 
  2.         swizzlingMethod(UIViewController.self, 
  3.         oldSelector: "viewDidLoad"
  4.         newSelector: "viewDidLoadForChangeTitleColor"
  5.   //do others 
  6.         return true 
  7.     } 

4. 原理說明

在程序入口處,通過運行時機制,動態的替換UIViewController的周期方法viewDidLoad 為我們指定的方法 viewDidLoadForChangeTitleColor 。在viewDidLoadChangeTitleColor 中,需要做兩件事:

· 調用原來的 viewDidLoad 方法

· 執行修改主題色相關代碼

如何調用原來的viewDidLoad方法:

在AppDelegate中,通過調用方法 swizzlingMethod 我們將 viewDidLoad 與viewDidLoadForChangeTitleColor 方法體進行了替換,原理如下圖:

從上面的圖可以看出,當在 viewDidLoadForChangeTitleColor 中執行:

  1. self.viewDidLoadForChangeTitleColor() 

是不會造成循環調用,反而是調用了我們期望執行的 viewDidLoad 方法體。

三、Xib/Storyboard的處理

一些在Xib/Storyboard中設置的主題色,比如文本顏色,按鈕的高亮顏色等,該如何處理呢,以UILabel為例,建立擴展

  1. extension UILabel { 
  2.     var colorString: String { 
  3.         set(newValue) { 
  4.             switch newValue { 
  5.             case "main"
  6.                 self.textColor = UIColor.applicationMainColor() 
  7.             case "second"
  8.                 self.textColor = UIColor.applicationSecondColor() 
  9.             case "warning"
  10.                 self.textColor = UIColor.applicationWarningColor() 
  11.             default
  12.                 self.textColor = UIColor.applicationSecondColor() 
  13.             } 
  14.         } 
  15.         get { 
  16.             return self.colorString 
  17.         } 
  18.     } 

在Xib/Storyboard的查檢器中進行編輯,如下圖:

四、總結

1.只有一套主題時,上面的方法可以直接復制使用,在更換主題時,只需要更換相應圖片及修改UIColor的擴展類。

2.在有多套主題,用戶可以自由切換主題時,可以按文章中的Hook機制,對viewWillAppear 進行劫持,也可以輕松實現主題的改變。

本文鏈接:http://www.cocoachina.com/swift/20141127/10336.html

責任編輯:chenqingxiang 來源: cocoachina
相關推薦

2021-07-15 13:57:34

災難恢復DRaaS數據中心

2015-05-14 09:31:10

2018-12-03 11:59:42

Inventec解決方案

2018-12-03 12:26:30

YADRO解決方案

2018-12-03 12:13:21

Mellanox解決方案

2012-05-27 16:21:31

IDC華為

2018-12-03 12:17:27

Semptian解決方案

2016-03-13 17:58:57

2009-03-05 10:38:00

2011-05-05 15:36:25

深信服廣域網加速

2010-12-24 13:05:22

2012-05-28 13:30:00

華為SmartCDN

2010-12-24 12:51:36

2010-10-21 21:53:46

IMOSIP多媒體H3C

2016-03-13 17:35:18

2011-12-09 11:13:17

2009-12-23 21:06:47

統一通信多媒體聯絡中心平臺華為

2009-07-15 17:09:32

Swing線程

2010-12-21 17:28:58

2012-05-27 17:01:36

華為云教育數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人一区二区三区电影 | 99精品亚洲国产精品久久不卡 | 国产精品久久国产精品久久 | 亚洲一区二区视频 | 欧美激情久久久 | 色av一区 | 日韩精品一区二区三区中文字幕 | 韩日在线 | 99国产精品一区二区三区 | 久久久久久国 | 久久av一区二区三区 | 欧美欧美欧美 | 欧美国产日韩精品 | 欧美精品一区三区 | 欧美日韩一区二区三区在线观看 | 91原创视频在线观看 | 亚洲精品一区二区 | 国产亚洲一区精品 | 日韩在线一区二区三区 | 天天玩天天操天天干 | 天天干天天干 | 精品国产一区二区三区在线观看 | 在线视频日韩 | 久久精品成人热国产成 | 日韩欧美网 | 国产日韩一区二区三免费高清 | 精品1区2区3区4区 | 欧美一级欧美一级在线播放 | 日韩一区精品 | 欧美精品第一页 | 岛国在线免费观看 | 国产精品久久精品 | 中文字幕一区二区三区日韩精品 | 国产成人免费视频网站高清观看视频 | 超黄视频网站 | 亚洲美女视频 | 亚洲视频在线看 | 日韩在线免费 | 欧美一级欧美三级在线观看 | 四虎影院一区二区 | 久久亚洲一区二区 |