iOS AutoLayout의 Intrinsic Content Size 정보

7475 단어 AutoLayoutSwiftiOS

입문


이 글은 iOS를 이해하는 AutoLayout에 없어서는 안 될 "Intrinsic Content Size"를 소개합니다.SwiftUI가 화제가 되었지만 몇 년 동안 기존의 AutoLayout을 전제로 한 레이아웃도 많기 때문에 손실이 없다는 것을 알게 된 정보라고 생각합니다.

Intrinsic Content Size


Intrinsic은 익숙하지 않은 영어 단어지만'고유','원래 갖추고 있다'는 뜻을 가지고 있어 어떤 보기 내용의 최저 크기를 나타낸다.
예를 들어, UILAbel은 표시할 문자열과 글꼴의 특정 크기를 결정하고, UIIMageView는 표시할 이미지 크기에 표시할 특정 크기를 결정합니다.

AutoLayout을 사용하는 레이아웃의 경우 Intrinsic Content Size를 고려하여 레이아웃을 계산합니다.이것은 표시 내용의 크기를 따로 지정하지 않아도 잘 보일 수 있는 구조이다.반대로 때로는 순조롭지 못할 수도 있기 때문에 Intrinsic Content Size가 어떻게 작동하는지 알아야 한다.

Intrinsic Content Size는 UIVIew 클래스의 속성입니다.


UIVIew 클래스는 Intrinsic Content SizeintrinsicContentSize를 나타내는 속성을 가지고 있습니다.
var intrinsicContentSize: CGSize { get }
이 속성은 읽기 전용 속성입니다.일반적으로 intrinsicContentSize를 가져오는 데만 사용할 수 있지만, UIVIew의 하위 클래스에서 intrinsicContentSize를 덮어쓰면 intrinsicContentSize를 변경할 수 있습니다.
예를 들어, 내부에 공백이 있는 UILAbel을 만들려면 다음과 같이 정의할 수 있습니다.간단하게 느낌 좋은 배지 UI를 만들기 위한 Tips입니다.
// 内部に余白を持ったUILabel
public class PaddingLabel: UILabel {
    // 余白のサイズ
    public let padding: UIEdgeInsets = .zero

    // テキストの描画範囲を余白のInsetを加えたものにする
    public override func drawText(in rect: CGRect) {
        super.drawText(in: rect.inset(by: padding))
    }

    // Intrinsic Content Sizeを余白のInset加えたものにする
    public override var intrinsicContentSize: CGSize {
        var intrinsicContentSize = super.intrinsicContentSize
        intrinsicContentSize.height += padding.top + padding.bottom
        intrinsicContentSize.width += padding.left + padding.right
        return intrinsicContentSize
    }
}
// 上下に4px、左右に8pxの余白を設定する
paddingLabel.padding = UIEdgeInsets(top: 4, left: 8, bottom: 4, right: 8)

StoryBoard/XIB에서 Intrinsic Content Size를 임시로 설정할 수 있습니다.


StoryBoard/XIB에서 Intrinsic Content Size를 임시로 설정할 수 있습니다.이 설정은 실행할 때 영향을 받지 않습니다.내용은 API에서 가져온 것과 같은 동적 변화이지만 StoryBoard/XIB에서 임시 레이아웃을 할 수 있도록 Placeholder로 설정할 수 있을 것 같습니다.
Intrinsic Size를 Default(System Defined)에서 Placeholder로 설정하여 설정할 수 있습니다.

컨텐츠 설계 우선 순위 및 컨텐츠 압축 우선 순위


Intrinsic Content Size와 관련하여 Content Hugging Priority와 Content Compression Resistance Priority가 있습니다.이를 CHCR Priority라고 합니다.
내용 우선권은 내용 크기보다 큰 우선권이고, 내용 압축 저항 우선권은 내용 크기보다 작기 어려운 우선권이다.

컨텐츠 압축 성능 레벨의 기본값은 750이지만 컨텐츠 Hugging Priority는
값은 보는 하위 클래스에 따라 다릅니다.예를 들어 UITextView와 UIButton은 250이고 UILAbel과 UIimageView는 251입니다.또한 콘텐츠 크기보다 작을 수 없는 유형, 예를 들어 UISwitch와 UIActivity IndicatorView, 콘텐츠 Hugging Priority는 750이다.
카테고리
Content Hugging Priority
Content Compression Resistance Priority
UITextView
250
750
UIButton
250
750
UILabel
251
750
UIImageView
251
750
UISwitch
750
750
UIActivityIndicatorView
750
750
제약조건(NSLayoutConstraint)의 기본 우선 순위는 1000이므로 제약조건의 컨텐트 크기를 명시적으로 지정하면 제약조건의 컨텐트 크기가 우선합니다.
컨텐츠 Hugging Priority 및 컨텐츠 압축 기능 Priority는 크기를 결정할 수 있는 뷰에 충분한 제약이 없는 경우 NSContentSizeLayoutConstraint라는 제약을 만드는 데 사용됩니다.
NSContentSizeLayoutConstraint에는 다음과 같은 제한이 있습니다.
  • 뷰 크기가 intrinsicContentSize보다 작거나 같음(우선순위: Content Hugging Priority 값)
  • 뷰 크기가 intrinsicContentSize보다 크거나 같음(우선순위: Content Compression Resistance Priority 값)
  • ※ NSLayoutConstraint와 NSLayoutConstraint의 우선 순위는 동시에 NSLayoutConstraint가 우선합니다.

    총결산

  • Intrinsic Content Size는 뷰를 표시하는 데 사용되는 최소 크기
  • intrinsicContentSize 속성을 계승하여 IntrinsicContentSize
  • 를 설정할 수 있습니다
  • 뷰 크기를 결정하는 제약조건이 부족하면 Intrinsic Content SizeLayoutConstraint, Content Hugging Priority 및 Content Compression Resistance Priority 값을 기반으로 NStontSizeLayoutConstraint 제약조건을 자동으로 설정합니다
  • 참고 자료

  • Apple - Auto Layout Guide
  • 자동 레이아웃 iOS 응답 디자인 파악
  • 좋은 웹페이지 즐겨찾기