最近使用了一下 IBAnimatable赖阻,這個庫對 IBInspectable
的使用真讓人嘆為觀止啰脚。突然意識到其實 IBInspectable
可以讓我們減少很多不必要的重復(fù)代碼伪阶。對一個 UIView
進行描邊是我們在開發(fā)過程中比較常用的均驶,UI 設(shè)計師們希望通過描邊來增加界面的層次感磺芭。
常見的描邊實現(xiàn)
通過 UIView 實現(xiàn)描一條線
在剛開始做 iOS 開發(fā)時骆撇,我很喜歡使用這樣的方式。但后來發(fā)現(xiàn)這種實現(xiàn)用一下兩個缺點:
- 后期如果 UI 需要重新調(diào)整羽德,會變得比較痛苦几莽。
- 一般描邊都只需要1個像素的描邊,在使用
Xib
或StoryBoard
的時候需要設(shè)置 0.5 這樣的值宅静。Xib
和StoryBoard
好像支持的不太好章蚣,經(jīng)常會出現(xiàn)在 plus 上描邊的線看起來特別粗。
通過 CALayer 繪制描邊
這個方法實現(xiàn)描邊的效果很不錯坏为。但還是有些缺點:
- 有些
UIView
其實在代碼中不需要體現(xiàn)究驴,但因為需要描邊。我必須把它拖到代碼中匀伏。 - 代碼中到處出現(xiàn),進行描邊的代碼蝴韭,一定程度影響代碼的美觀和閱讀性(PS: 我有潔癖)够颠。
對這些實現(xiàn)進行封裝的確是一個不錯的選擇。但我也許還有可能有更好的方案榄鉴。
使用 IBInspectable
這里我只描述我的實現(xiàn)思路履磨,不對 IBInspectable
進行介紹。畢竟 IBInspectable
是 2014WWDC 的內(nèi)容了(PS: 比我學(xué)習(xí) iOS 還要早 = =)庆尘,很多大神都有博客對其介紹剃诅。
思路如下:
- 可以使用
IBDesignable
將屬性定義到 IB 中驶忌,通過定義屬性矛辕,實現(xiàn)描邊笑跛。 - 我們可以統(tǒng)一在
layoutSubviews
中進行描邊處理。 - 我不希望為了實現(xiàn)描邊還去繼承一個類聊品,所以我選擇對
UIView
通過Category
實現(xiàn)描邊的功能飞蹂。 - 我需要增加一下新的屬性來定義描邊,所以我需要使用
AssociatedObject
實現(xiàn)翻屈。對于AssociatedObject
不了解的同學(xué)可以看南峰子的這篇博客 Objective-C Runtime 運行時之二:成員變量與屬性陈哑。 - 由于我希望通過
Category
實現(xiàn)描邊,我還需要使用Method Swizzling
實現(xiàn)伸眶。在每個UIView
及其子類 在實現(xiàn)layoutSubviews
去執(zhí)行我的描邊代碼惊窖。不了解的同學(xué)可以看南峰子的這篇博客 Objective-C Runtime 運行時之四:Method Swizzling。
最終實現(xiàn)效果
如圖厘贼,只需要在 IB 上配置上屬性爬坑,就可以實現(xiàn)描邊的功能。
![](https://github.com/bay2/IBViewExt/raw/master/demo2.png)
這樣做還是有缺點的涂臣,IB 上的屬性有點多盾计。。赁遗。
對于代碼感興趣的同學(xué)可以到https://github.com/bay2/IBViewExt署辉,我在這里就不貼代碼了,代碼不多看 UIView+IB.m
文件就可以了岩四。