[UIKit] override func layoutSubviews() vs. override init(frame: CGRect)

jess·2023년 4월 12일
0

[iOS]

목록 보기
2/9

override func layoutSubviews()

  • UIView 클래스 메서드 중 하나로, 뷰가 그려지는 시점에서 자동으로 호출된다.
  • 뷰의 서브뷰를 배치하거나 뷰의 크기나 위치를 조정할 때 사용된다.

override init(frame: CGRect)

  • UIView의 초기화 메서드 중 하나로, 뷰를 만들 때 호출된다.
  • 뷰를 만들 때 필요한 초기화 작업을 수행한다.
    • 예를 들어, 뷰에 대한 속성을 설정하거나, 서브 뷰를 추가하거나, 뷰의 모양을 변경하는 작업을 수행할 수 있다.

정리

override func layoutSubviews()는 뷰가 이미 생성되어 화면에 표시되고, 뷰의 크기나 위치가 변경되었을 때 호출되며, override init(frame: CGRect)는 뷰가 처음 생성될 때 호출된다.


💡 나의 궁금증

  • 이런 collectionView를 그리는 레이아웃은 어디에 넣어야할까?
extension PhotoCollectionViewCell: LayoutProtocol {
    func setSubViews() {
        addSubview(imageView)
    }
    func setLayout() {
        imageView.snp.makeConstraints { $0.edges.equalToSuperview() }
        imageView.contentMode = .scaleAspectFill
        imageView.clipsToBounds = true
    
    }
}
  • override func layoutSubviews() 함수는 뷰가 이미 생성되어 화면에 표시되고, 뷰의 크기나 위치가 변경되었을 때 호출된다.
    • 따라서 override func layoutSubviews() 내에서 호출하는 것은 뷰가 변경될 때 마다 매번 호출되는 것이므로 적합하지 않다.
  • 반면에 override init(frame: CGRect) 함수는 뷰가 생성될 때 한 번만 호출되므로, 이 함수 내에서 호출하는 것이 더 적합하다.

따라서

override init(frame: CGRect) {
    super.init(frame: frame)
    setSubViews()
    setLayout()
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

이렇게 해주면 끝~

0개의 댓글