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 關注
- 709 瀏覽
添加回答
舉報