UIKit类的子类化的最佳实践

时间:2016-03-03 18:46:21

标签: ios swift uiview uibutton uikit

我正在使用Swift,我发现自己必须继承UIKitUIViewUIButton类。因为我使用AutoLayout,所以我不关心设置框架,所以我不想/需要使用init(frame: CGRect)

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)在我的代码中,但实际上并没有做任何事情。

谢谢!

3 个答案:

答案 0 :(得分:1)

在初始化子类期间,必须调用超类的指定初始值设定项。在您的情况下,由于您是以编程方式创建这些视图,因此必须使用super.init(frame: CGRect)。正如您所提到的,为您的子类实现两个指定的初始值设定项是有用的,其中一个接收器采用frame:CGRect参数。

请查看this question的已接受答案,以获得更全面的审核。

答案 1 :(得分:0)

如果你在故事板或xib中使用autolayout,那么只需覆盖init(coder:)方法,以便它调用超类的版本,并让你的方便初始化程序通过CGRectZero或其他一些值。

答案 2 :(得分:0)

您可以尝试使用扩展名,而不是创建新的类和子类。

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