3 回答
TA贡献1796条经验 获得超4个赞
这在Google中仍然很高。以下是swift的更新示例。
该didLoad函数使您可以放置所有自定义的初始化代码。正如其他人提到的那样,didLoad当通过编程方式创建视图init(frame:)或XIB反序列化器通过以下方式将XIB模板合并到您的视图中时,将被调用init(coder:)
除了:layoutSubviews,updateConstraints大多数视图被多次调用。当视图的边界发生变化时,此功能适用于高级多遍布局和调整。就我个人而言,我尽可能避免使用多遍布局,因为它们会消耗CPU周期并使所有事情变得头疼。另外,我很少在初始化器中放入约束代码,因为我很少使它们无效。
import UIKit
class MyView: UIView {
//-----------------------------------------------------------------------------------------------------
//Constructors, Initializers, and UIView lifecycle
//-----------------------------------------------------------------------------------------------------
override init(frame: CGRect) {
super.init(frame: frame)
didLoad()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
didLoad()
}
convenience init() {
self.init(frame: CGRectZero)
}
func didLoad() {
//Place your initialization code here
//I actually create & place constraints in here, instead of in
//updateConstraints
}
override func layoutSubviews() {
super.layoutSubviews()
//Custom manually positioning layout goes here (auto-layout pass has already run first pass)
}
override func updateConstraints() {
super.updateConstraints()
//Disable this if you are adding constraints manually
//or you're going to have a 'bad time'
//self.translatesAutoresizingMaskIntoConstraints = false
//Add custom constraint code here
}
}
TA贡献1809条经验 获得超8个赞
Apple 文档中有一个不错的摘要,iTunes上提供的免费斯坦福课程对此做了很好的介绍。我在这里介绍我的TL; DR版本:
如果您的类主要由子视图组成,则在init方法中分配它们的正确位置。对于视图,有两种不同的init方法可以调用,这取决于是从代码还是从笔尖/ storyboard实例化视图。我要做的是编写自己的setup方法,然后从initWithFrame:和initWithCoder:方法中调用它。
如果要进行自定义绘图,则确实要drawRect:在视图中进行覆盖。但是,如果自定义视图主要是子视图的容器,则可能不需要这样做。
仅layoutSubViews当您要执行纵向或横向方向上的添加或删除子视图之类的操作时才覆盖。否则,您应该可以不理会它。
- 3 回答
- 0 关注
- 673 浏览
添加回答
举报