ios開發中,User Defined Runtime Attributes的應用

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 在iOS中隨處都可以看到絢麗的動畫效果,實現這些動畫的過程并不復雜,今天將帶大家一窺ios動畫全貌。在這里你可以看...
    每天刷兩次牙閱讀 8,551評論 6 30
  • 今天感冒好了。所以打算開始進行一點不一樣的生活,昨天雖然感冒,但是因為獨處了。所以心癮還是特別的重,今天就好很多了...
    對月飲酒閱讀 136評論 0 0
  • 今早一打開手機,就看到了件大快人心的新聞,“樂天史上最強促銷,銷售額不升反降”,國民同胞們,這次真是要好好表揚你們...
    小諾z閱讀 303評論 3 5
  • 公元528年,孝昌三年,爾朱榮率高歡侯景慕容紹宗賀拔勝兄弟一干梟雄,大破河北起義軍葛榮百萬(實三十萬)大軍于...
    家榮云川閱讀 702評論 0 2