Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] sizeToFit vs sizeThatFits 개념 본문

iOS 응용 (swift)

[iOS - swift] sizeToFit vs sizeThatFits 개념

jake-kim 2024. 4. 12. 01:12

sizeToFit() 개념

  • subview들을 감싸는 알맞은 크기로 view를 리사이징하는 하는 것
    • 알맞은 크기: 뷰가 가지고 있는 subview들의 콘텐츠 사이즈를 딱 채운 크기 (UILabel같은 경우 text를 감싼 크기이고, UIImageView에서는 image를 감싼 크기를 의미)
    • 여기서의 알맞은 크기는 아래에서 알아볼 sizeThatFits에서 리턴되는 값을 사용함
  • 주의 사항)
    • 뷰가 기본적으로 가지고 있는 사이즈로 sizeToFit()되게 하고 싶지 않다면 이 메서드를 오버라이드 하면 안되고 아래에서 볼 sizeThatFits를 사용할 것

sizeThatFits 개념

  • 위에서 알아본 알맞은 크기 

  • sizeThatFits를 사용하면 뷰가 가지고 있는 subview들의 콘텐츠 사이즈를 딱 채운 크기를 반환해줌
  • 이 메서드를 오버라이딩하면 이 오버라이딩 한 결과값이 sizeToFit()에도 영향

sizeToFit과 sizeThatFits 차이?

  • sizeToFit은 sizeThatFits의 결과값을 활용하여 뷰를 업데이트 시키고, sizeThatFits는 단순히 계산하여 값만 리턴
    • sizeToFit을 호출하면 뷰의 크기가 실시간으로 fitting됨
    • sizeThatFits을 호출하면 뷰의 크기에는 영향을 미치지 않고 단순히 값만 리턴됨
    • 단순히 뷰의 크기를 가져와서 이 값을 사용하고 싶으면 sizeThatFits를 호출할 것 (만약 sizeToFit을 호출하면 뷰의 실시간 크기가 업데이트 되며 다른 중요한 main thread작업이 딜레이 되고 값비싼 호출이 될 것)

ex) 뷰가 화면에 그려지기 전에 view의 크기를 알아와야 하는 경우?

// bad case
someView.sizeToFit()
let someViewSize = someView.frame

// good case
let someViewSize = someView.sizeThatFits(someView.frame)
  • 또 sizeThatFits는 오버라이드가 가능하여 뷰의 크기에 관한 여러 커스텀이 가능
    • ex) UILabel을 사용할 때 inset값이 상하좌우로 20씩 들어가게끔 하고 싶은 경우 contentInset을 사용해도 되지만 UILabel 서브클래싱에서 sizeThatFits를 오버라이드하여 width, height 각각 40씩 더하기
class InsetLabel: UILabel {
    override func sizeThatFits(_ size: CGSize) -> CGSize {
        let sizeThatFits = super.sizeThatFits(size)
        return CGSize(width: sizeThatFits.width + 40, height: self.frame.height + 40)
    }
}

* 참고

- https://developer.apple.com/documentation/uikit/uiview/1622630-sizetofit#discussion

- https://developer.apple.com/documentation/uikit/uiview/1622625-sizethatfits

Comments