2016-03-03 62 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以获得更全面的评论。