開發中常常遇到切換主題,夜間模式什麼的,一般的做法都是變了新主題就判斷一下重新設定新值,**量較多還不夠清晰。yrtheme位址 :本庫將主題素材與**進行了分離,力求一次**繫結,後續只需要更改素材即可實現主題樣式更改
特性如下
具體使用步驟如下
在不同的主題**配置檔案中設定好相同鍵名的顏色、等等。在例子中,主題名稱為default的,對應的配置檔案為defaultcolor.plist和defaultimage.plist,當然,你可以根據自己需求重新定製主題和各素材名稱匹配獲取方式,例子中我實現了的主題素材獲取處理類為themehepler。
在程式用對常用控制項進行主題繫結,繫結**基本如下
_manager = [[yrthememanager alloc]init];
//繫結各種控制項資料
[_manager bindview:self.view bgcolorname:@"commonbgcolor"];
[_manager bindimageview:self.imageview imagename:@"testimage1"];
[_manager bindlabel:self.label titlecolorname:@"labeltitlecolor"];
[_manager bindbutton:self.button titlecolorname:@"labeltitlecolor" state:uicontrolstatenormal];
[_manager bindbutton:self.button titlecolorname:@"buttonhighlight" state:uicontrolstatehighlighted];
變更主題**
// 全域性主題更改
[[yrtheme shared]setcurrentthemename:@"dark"];
// 僅當前manager管理的主題更改
[_manager updatetotheme:@"dark"];
如果遇到無法繫結的屬性(比如layer的顏色什麼的),那只能老老實實通過監聽kyrthemechangenotification來處理主題變更的功能了。
關於內部實現
簡單說起來是使用了乙個字典,記錄了所有繫結過的控制項,當然是弱引用的,所以無需擔心記憶體問題
ps:關於如何在nsdictionary中弱引用儲存乙個物件,一般我們自己實現的使用如下方式:
//新建乙個類似這樣的物件
@inte***ce
yrthemesafeobject : nsobject
@property (weak, nonatomic) id obj;
@end
@implementation
yrthemesafeobject
@end
後續儲存時先用該物件包裝一下,再儲存字典中等等。
當然也有使用nshashtable
類的,有興趣的可以自行查閱文件。
當收到主題變更時,檢查儲存的所有控制項,賦值新的素材和樣式。說起來就這麼簡單,實現還是有點小麻煩的,具體請看demo。
主題與面板
主題和 主題類似於層疊樣式表 css 因為它們都可以為web頁面定義各種樣式。但主題比css更進一步,它允許給應用程式的頁面應用樣式 影象甚至css檔案,可以在應用程式 頁面或伺服器控制項級別上應用asp.net中的主題。建立主題 一 建立外觀檔案 1 可以有多個主題 3.在主題檔案下新增外觀檔案 ...
主題和面板
今天學習了主題和 知道了如何建立乙個主題themes,還有 skin 在.skin外觀檔案中可以定義web伺服器控制項的外觀,定義的樣式類似aspx頁面中的控制項的標籤,只是去除 id 等非外觀屬性。可以在頁面中設定好控制項樣式,將設定好的標籤複製到.skin外觀檔案中,再將非外觀屬性刪除即可 外觀...
主題與面板系列 3
按上一節,主題為 bluesky,其 檔案內容為 現在談談怎麼應用這個主題。一 在 aspx 檔案中,指令如下 page language c theme bluesky 控制項應用如下 page 指令中,theme 屬性值為主題資料夾的名稱,我們可以看到 l1 的寬度為 100px,l2 l3 指...