我正在使用Swift
,我发现自己必须继承UIKit
和UIView
等UIButton
类。因为我使用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)
在我的代码中,但实际上并没有做任何事情。
谢谢!
答案 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
}
}