該組件GitHub地址
據說一個終端開發人員將會有70%以上的時間在和UI打交道。自己想想也對,貌似有很大一部分時間花費在了調整UI樣式,addSubView還有layout上面。猛然間就發現自己的代碼中有大量這種東西存在
self.label.layer.cornerRadius = 3; self.label.textColor = [UIColor darkTextColor]; self.label.font = [UIFont systemFontOfSize:13]; self.label.backgroundColor = [UIColor greenColor]; self.label.layer.borderWidth = 2; self.label.layer.borderColor = [UIColor redColor].CGColor; self.label2.layer.cornerRadius = 3; self.label2.textColor = [UIColor darkTextColor]; self.label2.font = [UIFont systemFontOfSize:13]; self.label2.backgroundColor = [UIColor greenColor]; self.label2.layer.borderWidth = 2; self.label2.layer.borderColor = [UIColor redColor].CGColor; self.button.layer.cornerRadius = 3; self.button.backgroundColor = [UIColor greenColor]; self.button.layer.borderWidth = 2; self.button.layer.borderColor = [UIColor redColor].CGColor; self.aView.layer.cornerRadius = 3; self.aView.backgroundColor = [UIColor greenColor]; self.aView.layer.borderWidth = 2; self.aView.layer.borderColor = [UIColor redColor].CGColor; ......
上面的代碼是為了實現這樣的效果而寫的代碼。
很多幾乎是一毛一樣的代碼,充斥著整個APP。自己花在這些樣式調整上的時間也非常多。為了實現一個樣式效果,需要配置各種各樣的屬性。而且很多界面中這些樣式都是一樣的。於是又是無數次的重復上面的工作。oy my god!時間啊,就這樣流走了。做為一個懶人,就會發問有沒有一種可以少寫點代碼的方式呢?你可以寫一個子類嘛,但是會有類污染的問題,單純為了一個公有樣式,就創建個子類有點大材小用。那寫一批樣式渲染的函數呗,恩這個注意不錯,但是細想一下工作量也不小,而且不通用。於是,花了幾天的時間我寫了StyleSheet這個庫。為了的就是來簡化UI樣式的編碼。
通過上述描述我們可以發現,原始的寫UI樣式的問題:
繁瑣的代碼,大量重復性的工作
樣式無法共享,每一個View都需要重新進行樣式賦值。
而StyleSheet的設計目標就是:
樣式配置輕便化,能夠使用更加少的代碼來描述View的樣式
樣式在View之間的共享.不止是相同類的實例之間的共享,甚至是跨類的共享。
So,先看看上述代碼使用StyleSheet之後的效果:
self.label.style = DZLabelStyleMake( style.backgroundColor = [UIColor greenColor]; style.cornerRedius = 3; style.borderColor = [UIColor redColor]; style.borderWidth = 2; style.textStyle.textColor = [UIColor darkTextColor]; style.textStyle.font = [UIFont systemFontOfSize:13]; ); self.label2.style = self.label.style; self.aView.style = self.label.style; [self.button.style copyAttributesWithStyle:self.label.style];
設計與使用
在設計StyleSheet的時候故意淡化了被渲染的View的類型的概念,任何一種類型的Style可以對任何類型的View進行渲染,但是必須是這種類型的View支持Style所指稱的屬性。比如你可以使用真對Button設計的DZButtonStateStyle來渲染一個UILabel,但由於UILabel不支持DZButtonStateStyle中的渲染屬性,所以渲染結果是無效的。
但是當使用DZButtonStyle(繼承自DZViewStyle)來渲染UILabel的時候,會使用DZButtonStyle中其父類的某些渲染屬性,來渲染UILabel的父類UIView所支持的那些屬性。
DZLabelStyle* style =DZLabelStyleMake( style.backgroundColor = [UIColor greenColor]; style.cornerRedius = 3; style.borderColor = [UIColor redColor]; style.borderWidth = 2; style.textStyle.textColor = [UIColor darkTextColor]; style.textStyle.font = [UIFont systemFontOfSize:13]; ); [style decorateView:self.label];
直接渲染的好處是,不用再次生成Style對象,更加方便樣式在多個View之間渲染。
對UIKit中常用的一些組件進行了擴張為他們增利了style屬性,直接進行style屬性的賦值,會出發一次渲染操作。當第一次調用style屬性的時候,會自動生成一個zeroStyle並賦值。
self.label.style = style;
或者
self.label.style = DZLabelStyleMake( style.backgroundColor = [UIColor greenColor]; style.cornerRedius = 3; tyle.borderColor = [UIColor redColor]; style.borderWidth = 2; style.textStyle.textColor = [UIColor darkTextColor]; style.textStyle.font = [UIFont systemFontOfSize:13]; );
當進行賦值渲染的時候,會將Style的Copy後的實例與當前View綁定,當更改Style的屬性的時候,對應View的樣式會立刻改變。
使用原有的配置,進行通用樣式的共享是個非常困難的事情,基本上都是體力活,靠人力來維護。我們的代碼中會摻雜大量的用於配置樣式的代碼,而且是獨立且散在。
現在你可以通過StyleSheet解決:
//在頭文件中使用 xxx.h 聲明一個公有樣式 EXTERN_SHARE_LABEL_STYLE(Content) //在實現文件中使用 xxx.m ,實現一個公有樣式 IMP_SHARE_LABEL_STYLE(Content, style.backgroundColor = [UIColor clearColor]; style.cornerRedius = 2; style.textStyle.textColor = [UIColor redColor]; )
(1)使用共享樣式,方式一
self.label.style = DZStyleContent();
很多時候, 如果不需要進一步更改樣式,可以不采復制賦值的方式來進行渲染,可以直接使用:
[DZStyleContent() decorateView:self.label];好了,現在可以嘗試著換這種方式來寫UI樣式了。
該組件GitHub地址