IntrinsicContentSize 에 대해서 알아보기

2022. 11. 20. 12:31iOS

먼저 말할 수 있는 건 콘텐츠의 본질적인 크기입니다.

 

 

이 부분에 대해서 레이블로 표현을 해보겠습니다.

class BroadLabel: UILabel {

    override var intrinsicContentSize: CGSize {

        return CGSize(width: super.intrinsicContentSize.width + 50, height: super.intrinsicContentSize.height)

    }

}

 

먼저 이렇게 코드를 통해서 레이블을 만들고 IntrinsicContentSize를 주려고 합니다. 그럼 기본적인 크기에서 + 50을 했기 때문에 양옆으로 조금 더 커진다는 점을 볼 수 있을 것입니다.

 

class ViewController: UIViewController {

    let testLabel: BroadLabel = BroadLabel()

   레이블을 생성합니다. 아까 intrinsicContentSize를 주었던 레이블을 불러옵니다.

    override func viewDidLoad() {

        super.viewDidLoad()

        view.addSubview(testLabel)

        testLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true   뷰의 x축 센터

        testLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true    뷰의 y축 센터

        testLabel.translatesAutoresizingMaskIntoConstraints = false

        testLabel.backgroundColor = .red    백그라운드 컬러로 크기를 보여드릴 겁니다.

        testLabel.text = "안녕하세요."

    }

}

백그라운드 컬러가 먼가 커졌다는 게 느껴지시나요??

좀 더 알아보기 위해 레이블 위치를 센터로 변경해보겠습니다.

testLabel.textAlignment = .center 추가합니다.

사진에서 볼 수 있듯이 레이블 센터 정렬을 하고 난 뒤에 보시면 가로 양옆으로 간격이 생기게 되었습니다. 제일 처음 IntrinsicContentSize 사이즈를 가로 +50를 줬기 때문에 가능한 일입니다.!!

 

추가적으로 버튼으로도 테스트해보겠습니다.

 

class BroadButton: UIButton {

    override var intrinsicContentSize: CGSize {

        return CGSize(width: super.intrinsicContentSize.width, height: super.intrinsicContentSize.height + 50)

    }

}

우선 intrinsicContentSize 값을 만들어 줍니다. 이번엔 가로길이가 아닌 세로 길이를 주도록 하겠습니다.

 

func button() {

        let testButton: BroadButton = BroadButton()

        testButton.setTitle("클릭", for: .normal)

        view.addSubview(testButton)

        testButton.topAnchor.constraint(equalTo: view.topAnchor, constant: 400).isActive = true

        testButton.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 50).isActive = true

        testButton.translatesAutoresizingMaskIntoConstraints = false

        testButton.backgroundColor = .systemBlue

        testButton.addAction(UIAction(handler: { [weak self] _ in 

        guard let self = self else { return }

        self.testLabel.text = "사랑합니다"  // 버튼 액션을 주었을 경우에 안녕하세요 레이블 이름을 변경하기 위한 액션!

}), for: .touchUpInside)

    }

 

 

 

 

 

 

추가적으로!!   에드 액션에서 [weak self]를 안 써도 당장은 크래쉬가 나거나 에러가 발생하지는 않습니다.

하지만 메모리가 지속적으로 쌓이게 되기 때문에 [weak self]를 사용해주어야 합니다.

자동완성 부분에서 self를 써야만 하는 곳에서는 [weak self]를 써야 한다.! 이점을 알아주면 좋습니다.!!

testButton.addAction(UIAction(handler: { [weak self] _ in 

            guard let self = self else { return }

            self.testLabel.text = "사랑합니다"         //이스케이핑 -> 셀프를 쓴다

            //탈출클로저 있어서 셀프를 써줘야 한다. 안 쓰면 컴파일 에러가 난다 그래서 셀프를 써야 한다

            // 셀프를 쓰면 순환 참조가 발생된다 발생되면 메모리에 쌓이니깐 이걸 쌓이게 되지 않게 하기 위해

            //셀프를 쓰는 곳은 순환 참조가 발생하는 곳 그래서 셀프를 쓸 때 weak self를 쓰면 순환 참조 발생을 방지한다.