2017-03-24 38 views
0

有什麼方法可以在Swift中設置UIView和UIViewController的子類,以使用Xcode界面構建器創建的所有新UIView都使用我的子類中的默認值。子類化UIView,UIViewController並在故事板和界面生成器中直觀地顯示默認值

換句話說,如果我創建的UIView的子類的代碼:

import UIKit 

@IBDesignable 
class GenericUIView: UIView { 
    // MARK: Initialization 

    @IBInspectable 
    var myBackgroundColor : UIColor = UIColor.orange 

    override init (frame: CGRect) { 
     super.init(frame: frame) 
     setup() 
    } 


    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     setup() 
    } 

    func setup() { 
     self.layer.backgroundColor = (myBackgroundColor as! CGColor) 
    } 

} 

什麼我需要做的,這樣我可以立即看到在Xcode中的Interface Builder中的變化?

我希望能夠主題我的應用程序,而無需手動編輯所有屬性,仍然可以直觀地看到它們,而無需構建解決方案。我知道這是可能的重寫drawRect(),但這可能會減慢我的應用程序的性能,當它可能只是設置背景和文本顏色。

請儘可能在Swift語言中提供解決方案。

Patrick

+0

'UIView'已經有一個'backgroundColor'屬性,是在Interface Builder視察;你爲什麼要爲已經存在的包添加一個包裝屬性? – jlehr

+0

我試圖讓它們默認爲我將創建的所有新的UIView&UIViewControllers。我不想閱讀我的所有觀點來隨時編輯和更改顏色。 –

回答

0

這有幫助嗎?儘管如此,你將不得不改變你的所有視圖來使用這個類而不是UIView。您可以用同樣的方法添加其他屬性,如backgroundcolor(如您所知)。

// 
// DesignableView.swift 
// 
import UIKit 

@IBDesignable 
class DesignableView: UIView { 

    @IBInspectable var borderWidth: CGFloat = 0.0 { 
     didSet { 
      self.layer.borderWidth = borderWidth 
     } 
    } 

    @IBInspectable var borderColor: UIColor = UIColor.clear { 
     didSet { 
      self.layer.borderColor = borderColor.cgColor 
     } 
    } 

    @IBInspectable var cornerRadius: CGFloat = 0.0 { 
     didSet { 
      self.layer.cornerRadius = cornerRadius 
     } 
    } 
} 
+0

我確實試過你的解決方案。唯一的問題是即使我在默認設置的代碼中設置了值,它也不會顯示我的默認值。我必須手動去每個UIView並在Interface Builder中手動調整設置。見下面的代碼。 –

+0

我試圖在這裏粘貼代碼,但沒有格式化它看起來不正確。我創建並回答了代碼。 –

+0

我曾希望一旦IB重新加載對象,它會採取默認值爲你。 – Cliff

0

好的,我想我有。任何人都可以確認這是否是最佳實踐,如果這會在我的程序中稍後導致其他問題?這其實很簡單,然後我想: 進口的UIKit

@IBDesignable 
class GView: UIView { 

    override func layoutSubviews() { 
     super.layoutSubviews() 
     self.layer.backgroundColor = UIColor.orange.cgColor 

    } 
} 
相關問題