init(frame: CGRect)

  • Interface Builder에서 쓰이지 않고, 코딩(Programmatically)으로 UIView를 상속받은 클래스를 만들 때 사용
  • ex) let sampleButton = UIButton(frame: CGRect(x: 3, y: 0, width: 100, height: 200))

required init?(coder: NSCoder)

  • Interface Builder에서 생성되는 초기화 구문

 

Interface Builder란 간단하게 말해서는 xib, nib, storyboard를 사용하여 VIew를 작업하는 것!

 

View나 Button과 같은 것들을 커스텀하는 경우, 위 두가지의 초기화 구문이 필수

override init(frame: CGRect) {
	super.init(frame: frame)
	setupView()
}

required init?(coder aDecoder: NSCoder) {
	super.init(coder: aDecoder)
   	setupView()
}

 

 

awakeFromNib()

  • Interface Builder에서 객체가 init(coder:)로 초기화된 후 호출됨
  • IB에서 inspector와 같은 방법으로 값을 조정하면 위 커스텀 클래스는 아카이브되어 있다가 언아카이브됨(xib파일로)
  • init 시점에서는 frame과 관련된 크기, 위치 등 뷰가 완벽하게 만들어지지 않은 상태

awakeFromNib()와 init()에서 모두 설정해야 하는 이유

뷰를 만들고 커스텀 뷰를 IB에서 연결했을 땐, init(frame:), init(coder:)와 awakeFromNib() 구준데 모두에서 설정을 해준다

경험상 init(coder:) 시점에는 frame 이나 Layer 관련없는 값들, -> frame정보가 없으므로

awakeFromNib 시점에는 frame 이나 Layer 관련된 값들을 설정하도록 구현하면 됩니다.

init(frame:) 은 이미 frame 정보가 있으니까 괜찮구요.

물론 autoLayout 처리를 하는 경우는 awakeFromNib 보다 더 뒤에 해야합니다.

 

+ Recent posts