study record

[iOS] invalidateIntrinsicContentSize() 본문

iOS/iOS 정리

[iOS] invalidateIntrinsicContentSize()

asong 2022. 4. 5. 15:14

IntrinsicContentSize

본질적인 콘텐츠 크기이다. 대부분의 view들은 기본적으로 컨텐츠 크기만큼의 size를 가지고 있다.

UILabel, UIButton은 오토 레이아웃으로 구현할 때 제약사항으로 width와 height를 추가하지 않아도 오류가 나지 않는 이유는 intrinsicContentSize를 가지기 때문이다.

UIView 같은 경우는 IntrinsicContentSize를 가지지 않으며, ImageView,TextView는 컨텐츠에 따라 변화한다.

 

 

invalidateIntrinsicContentSize()

  • view의 컨텐츠의 크기가 바뀌었을 때 intrinsicContentSize프로퍼티를 통해 size를 갱신하고 그에 맞게 오토레이아웃이 업데이트되도록 만들어주는 메소드이다.
  • view의 content 크기가 바뀔 때 invalidateIntrinsicContentSize를 호출하면 intrinsicContentSize 값이 새로 계산되어 적용된다.
  • apple에서 제공해주는 view는 내부적으로 적용이 되어 있다.
  • 커스텀 뷰를 구현할 때는 intrinsicContentSize 프로퍼티와 더불어 invalidateIntrinsicContentSize() 메소드 구현이 필요하다.
public var point: CGFloat = 0 {
  didSet {
    self.currentWidth = getRateToWidth(self.current)
    self.maxWidth = getRateToWidth(CGFloat(self.max))
    
		// view의 컨텐츠 크기가 바뀔때 invalidateIntrinsicContentSize() 메소드를 실행
    invalidateIntrinsicContentSize()
  }
}

public override var intrinsicContentSize: CGSize {
  let count = CGFloat(self.max)
  var width = self.point * count
  width = width + CGFloat(count - 1) * self.spacing
  return CGSize(width: width, height: self.point)
}

 

- 추가적인 상황

테이블뷰에서 셀 아이템들이 추가되고 이 때 셀의 height 값 크기가 동적으로 적용되도록 해야할 때.

  • intrinsicContentSize 프로퍼티를 재정의하여 height 값을 재정의한다.
  • layoutSubviews 메서드를 재정의한다. 여기에서 invalidateIntrinsicContentSize()를 호출하여 자동으로 크기가 변하도록 적용한다.
final class MyTableView: UITableView {
  override var intrinsicContentSize: CGSize {
    let height = self.contentSize.height + self.contentInset.top + self.contentInset.bottom
    return CGSize(width: self.contentSize.width, height: height)
  }
  override func layoutSubviews() {
    self.invalidateIntrinsicContentSize()
    super.layoutSubviews()
  }
}

 

참고:

https://github.com/sujinnaljin/TIL/blob/master/Swift/intrinsicContentSize%20%EC%99%80%20invalidateIntrinsicContentSize().md

https://ios-development.tistory.com/925?category=899471

 

 

'iOS > iOS 정리' 카테고리의 다른 글

[iOS] iOS Framework  (0) 2022.07.22
[iOS] iOS 레이아웃 사이클  (0) 2022.04.06
[iOS] UIView의 Layer란?  (0) 2022.04.01
[iOS] UIResponder  (0) 2022.03.30
[iOS] NSCache란?  (0) 2022.03.26