成人免费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 12:17:27

Semptian解決方案

2012-05-27 16:21:31

IDC華為

2018-12-03 11:59:42

Inventec解決方案

2018-12-03 12:13:21

Mellanox解決方案

2018-12-03 12:26:30

YADRO解決方案

2016-03-13 17:58:57

2009-07-15 17:09:32

Swing線程

2010-12-21 17:28:58

2010-12-21 17:39:59

2012-05-27 17:01:36

華為云教育數據

2018-12-03 12:23:45

IBMMCM解決方案

2017-08-02 17:23:22

AzureIoTAWS

2018-12-03 12:04:10

Kyligence解決方案

2018-12-03 12:09:39

時速云解決方案

2010-12-21 17:38:12

2012-05-27 18:09:33

NAG Cache華為

2010-12-21 17:20:01

2011-12-09 11:13:17

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色狠狠一区| 午夜三区| 欧美二区在线 | 亚洲精品天堂 | 麻豆av片 | 99久久久久久 | 久久久久久一区 | 欧美亚洲高清 | 搞av.com | 成人欧美一区二区 | 成人午夜影院 | 日本视频一区二区三区 | 99re国产 | 国产一级视频免费播放 | 色在线看 | 亚洲一区二区三区在线 | 成人欧美一区二区三区1314 | 二区中文字幕 | 久久一久久 | 亚洲精品视频网站在线观看 | 免费成人av网站 | 黑人精品欧美一区二区蜜桃 | 久热中文字幕 | 综合精品 | 在线观看国产视频 | 人人干人人舔 | 久久免费观看一级毛片 | 开操网 | 欧美国产日韩在线观看 | 成人h视频| 久久狼人天堂 | 91高清在线视频 | 国产激情91久久精品导航 | 欧美成人一区二区三区 | 伦理一区二区 | 久久av影院 | 久久亚洲一区 | 九九热在线免费视频 | 成人网址在线观看 | 亚洲日本乱码在线观看 | 日本精品在线观看 |