使用 IBInspectable 和 IBDesignable
最近 Xcode 版本中最酷的新功能中的一個(或兩個)是 IBInspectable
屬性和 IBDesignable
UIView
s。這些與你的應用程式的功能無關,而是影響 Xcode 中的開發人員體驗。目標是能夠在不執行 iOS 應用程式的情況下直觀地檢查自定義檢視。因此,假設你有一個創造性地命名為 CustomView
的自定義檢視,該檢視繼承自 UIView
。在此自定義檢視中,它將顯示具有指定顏色的文字字串。你也可以選擇不顯示任何文字。我們需要三個屬性:
var textColor: UIColor = UIColor.blackColor()
var text: String?
var showText: Bool = true
然後我們可以覆蓋類中的 drawRect
函式:
if showText {
if let text = text {
let s = NSString(string: text)
s.drawInRect(rect,
withAttributes: [
NSForegroundColorAttributeName: textColor,
NSFontAttributeName: UIFont(name: "Helvetica Neue", size: 18)!
])
}
}
假設設定了 text
屬性,這將在執行應用程式時在檢視的左上角繪製一個字串。問題是如果不執行應用程式,我們將不知道它是什麼樣的。這就是 IBInspectable
和 IBDesignable
的用武之地 .IBInspectable
允許我們在 Xcode 中直觀地設定檢視的屬性值,就像內建控制元件一樣。IBDesignable
將向我們展示故事板中的視覺預覽。以下是該類的外觀:
@IBDesignable
class CustomView: UIView {
@IBInspectable var textColor: UIColor = UIColor.blackColor()
@IBInspectable var text: String?
@IBInspectable var showText: Bool = true
override func drawRect(rect: CGRect) {
// ...
}
}
或者在目標 C 中:
IB_DESIGNABLE
@interface CustomView: UIView
@property (nonatomic, strong) IBInspectable UIColor* textColor;
@property (nonatomic, strong) IBInspectable NSString* text;
@property (nonatomic, assign) IBInspectable BOOL showText;
@end
@implementation CustomView
- (instancetype)init {
if(self = [super init]) {
self.textColor = [UIColor blackColor];
self.showText = YES;
}
return self;
}
- (void)drawRect:(CGRect)rect {
//...
}
@end
下一個螢幕截圖顯示了 Xcode 中發生的事情。第一個是新增修訂後的類後發生的事情。請注意,這三個屬性有三個新的 UI 元素。該文字顏色會顯示顏色選擇器,文字只是一個輸入框和顯示文字會給我們它們分別是 false
和 true
為 Off
和 On
的選項。
接下來是使用顏色選擇器將文字顏色更改為紅色。此外,還提供了一些文字以使 drawRect
功能顯示它。請注意,Interface Builder 中的檢視也已更新。
最後,在屬性檢查器中將“ 顯示文字” 設定為 Off
使得 Interface Builder 中的文字顯示消失。
然而,當我們需要在你的 Storyboard
中的多個檢視建立圓形 UIView
時,我們都會出現這種情況。而不是向 Storyboard
的每個檢視宣告 IBDesignable
,更好的是建立 UIView
的 UIView
並獲得專為你的每個 tihuan 建立的使用者介面 24 整個專案通過設定角半徑來建立圓角檢視。在故事板中建立的任何 UIView 上的可配置邊框半徑。
extension UIView {
@IBInspectable var cornerRadius:CGFloat {
set {
layer.cornerRadius = newValue
clipsToBounds = newValue > 0
}
get {
return layer.cornerRadius
}
}
}