2016-03-03 61 views
1

我使用的是Swift,我發現自己必須繼承UIKit子類,如UIViewUIButton。我不在乎設置框架,因爲我使用的是AutoLayout,所以我不想/不需要使用init(frame: CGRect)UIKit類繼承的最佳實踐

class customSubclass: UIView { 
    var logo: UIImage 
    init(logo: UIImage) { 
     self.logo = logo 

     //compiler yells at me since super.init() isn't called before return from initializer 

     //so I end up doing this 
     super.init(frame: CGRectZero) 
     self.translatesAutoresizingMaskIntoConstraints = false 
    } 

我也並不覺得很性感來設置它的框架CGRectZero

有沒有一種方法來爲UIView或UIButton的子類自定義初始值設定項,而無需明確設置它的框架?

注意每個子類都在代碼中實例化,所以required init(coder: aDecoder)在我的代碼中,但實際上並沒有做任何事情。

謝謝!

+1

海事組織最好不要讓視圖本身設置爲知道你要用自動佈局調整大小。它應該根據您在初始化程序中傳遞的內容將其框架初始化爲合理的值。在你的例子中,可能起源爲0,0,大小等於logo.size。 – dan

+0

@dan如果我無視這個問題,我會通過傳遞一個有效的框架來獲得什麼?我可以做的另一件事是創建一個'init'函數,該函數接受'frame'以及其他需要的參數,我需要像'init(frame:CGRect,logo:UIImage)' '但是我不得不在視圖控制器中定義框架 –

+0

您的視圖不應該知道您將忽略框架。它應該建立起來,這樣它就會有一個合理的框架,即使它創造了它也不會給它一個新的框架。 – dan

回答

0

如果你在故事板或XIB使用自動佈局,然後只需重寫init(coder:)方法,使其調用父類的版本,並讓您方便的初始化通過CGRectZero或其他一些價值。

+0

我在我的問題中說我正在實例化代碼中的所有東西,所以'init(coder:)'是沒用的。它只是在那裏爲我保持與編譯器的良好關係 –

0

而不是創造的一個新的類和子類,你可以嘗試使用擴展。

extension UIView { 
    var logo: UIImage = myImage 
    func myLogo() { 
     // code here 
    } 
} 
+1

這段代碼做了什麼? –

+0

這只是給UIView類添加一個函數,而不是返回我需要的子類的實例 –

1

在子類的初始化過程中,您必須調用超類的指定初始值設定項。在你的情況下,由於你是以編程方式創建這些視圖,所以你必須使用super.init(frame: CGRect)。正如你所提到的那樣,爲你的子類實現兩個指定的初始化器是有用的,其中一個需要參數frame:CGRect

請參閱接受的答案this question以獲得更全面的評論。