User Defined Runtime Attributes 是一個不被看重但功能非常強大的的特性,它能夠配置一些你在interface builder 中不能配置的屬性。當你希望在IB中作盡可能多得事情,這個特性能夠幫助你編寫更加輕量級的viewcontroller。
1、在什么情況下使用
當你使用IB(Storyboard或者Xib)編輯視圖的時候,有時可能會遇到諸如 圓角、邊框、邊框顏色、等等難以通過IB直接設置的屬性。
這時你不得不借助代碼實現。其實當出現這類情況時,我們其實可以借助Runtime Attribute在IB中實現。
2、如何使用
如圖所示,在IB中,點擊任意一個控件切換到identity inspector
在User Defined Runtime Attributes新增屬性
在這里可以為控件設置值為
Boolean - BOOL
Number - NSNumber 對象 或者 枚舉 或者 NSInteger 或者CGFloat
String - NSString *
Point - CGPoint
Size - CGSize
Range - NSRange
Color - UIColor *
等屬性,但必須逐級調用
例如 layer.cornerRadius layer.masksToBounds 這里其實是 對象.layer.cornerRadius 的調用關系
同時,你甚至可以為它設置一個自定義的屬性
比如你可以隨意擴充一個名位 status 的屬性表示開啟狀態,但前提是你必須為控件自定義一個實現了 runtime自動構建成員的引用。
如圖1所示,這里有一個 layer.borderColorFromeUIColor,這實際上是我為了解決IB不能設置CGColor和為CALayer引入的一個屬性。
如圖2所示,我們在Swift中為CALayer 擴展一個屬性
使用的時候寫成 layer.borderColorFromUIColo(標準的Set方法調用),這樣IB也可以設置CGColor了
編譯運行,及實現了在IB中為控件設置 圓角,邊框,邊框顏色
1.如何使用
當你使用interface builder是點擊任意一個控件,轉換到identity Inspector
圖 1
2屬性類型
下面是一些可用的Attribute Types與其相對應的數據類型
Boolean– BOOL
Number–NSNumber * or any numeric scalar, e.g. NSInteger
String– NSString *
Point ?– CGPoint
Size ?– CGSize
Rect– CGRect
Range–NSRange
Color– UIColor *
這里還有下面一些特殊的類型:
Nil- 就是設置這個屬性為nil
Localized String - 一個在locale文件當中的鍵值,它會在你的 strings 文件中去匹配對應的本地化字符
demo
配置一個 view 下面的CALayer 的屬性,一般我們都是在viewController里的viewDidLoad里寫代碼進行配置,現在如果你要設置
layer.borderWidth 和 layer.cornerRadius 你只需要如下所示:
編譯運行如下:
如果說你要配置一個自定義的控件,你就可以在User Defined Runtime Attributes里配置你的自定義的屬性了 如 你的自定義的Button 自定義了一個叫name的屬性那可以
如果你要在代碼中獲取你的自定義屬性,你就可以
id value = [sender valueForKey:@"name"];
Converting From Other Types
只要相應的attribute type代表的時同樣的數據類型,那么他們就可以相互替換使用。例如:Point和Size他們地下其實都是同樣的結構體{float a,float b}。
但是除了上述幾種attribute type,你還可以使用其他的IB不支持數據類型嗎?例如我要配置CALayer的 border coloer 和 shadow color,他們都是CGColorRef類型的,并不能直接在User Defined Runtime Attributes進行配置,但請看解決方案:
圖5
為了兼容CALayer 的KVC ,你得給CALayer增加一個分類
@implementation CALayer (Additions)
- (void)setBorderColorFromUIColor:(UIColor *)color
{
self.borderColor = color.CGColor;
}
@end
Convert From String
這經常從NSString中轉換成你所要的類型,例如 配置一個 UIEdgeInsets類型的屬性,這個不能夠被運行時屬性支持,但可以考慮如下方案
@implementation UIScrollView (Additions)
- (void)setContentInsetFromString:(NSString *)contentInsetString
{
self.contentInset = UIEdgeInsetsFromString(contentInsetString);
}
@end