• 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    미해결

updateConstrants 부분에서 질문이 있습니다!

23.11.06 17:41 작성 조회수 197

0

override func updateConstraints() {
        print(#function)
        myButton.widthAnchor.constraint(equalTo: self.widthAnchor, multiplier: 0.5).isActive = true
        myButton.heightAnchor.constraint(equalTo: self.heightAnchor, multiplier: 0.5).isActive = true
        myButton.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
        myButton.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true

        super.updateConstraints()
    }

지금 ViewCycleCustomBtn 프로젝트 설명해주실 때 궁금증이 생겨서 질문드립니다.

 

일단 제가 이해한 바로는 런루프가 돌면서 드로잉사이클을 1초에 최대60회까지 다시 사이클을 도는걸로 이해했습니다.

 

만약 1초에 필요에 의해 20번이 불렸다고 가정했을 때,
그럼 updateConstraints라는 함수도 20번이 불릴거 같은데요.

 

  1. 그럼 제약이 중복돼서 (20 * 제약조건 4개) 80개가 활성화 되는 느낌이 아닌가요?
    저 메서드 내부에서 제약 초기화를 해주는건가요?


    제가 이해를 잘못한걸까요?

 

  1. 만약 초기화가 된다고 해도, 저 메서드 내부에서 저렇게 설정 해버리면 결국 20번이 불릴 텐데 init 내부에서 제약조건을 한번만 설정 하는게 낫지 않나요? (불필요한 작업 이라고 생각이 들어서요)

     

 

답변 2

·

답변을 작성해보세요.

0

Pooo님의 프로필

Pooo

질문자

2023.11.06

아 결국 1번 답변의 경우
필요할 때만 불리거나, 강제적으로 호출할 때만 불리기 때문에 상관없다 정도로 이해하면 될까요?

제가 우려한건? 오토레이아웃 코드가 init이나 viewDidLoad외에 여러번 불릴 수 있는 메서드에 있다면 (조건에 따라 동적인 값을 준다던가 하면) 뭔가 충돌나지 않을까 싶은 점이였습니다!

일반적으로는 init에서 구현 하기 때문에, 걱정할 것이 없다고 보시면 됩니다.

(그리고 우리가 원하는 필요 구현에 따라.. 정말 애니메이션이 필요한 경우 등.. 의 제한된 상황에서 구현할 테니 그것도 걱정할 필요가 없을 것 같아 보입니다. 또 말씀드렸지만, 여러번 불리지 않습니다. ^^ 필요한 경우 한번만 호출이 되고, 기존 제약이 업데이트 되는 방식이기 때문에 걱정하실 필요가 없습니다.)

0

네 안녕하세요 Pooo 님!

1. 답변
(런루프는 1초에 60번 도는게, 맞습니다.) 말씀하신 대로 1초에 20번이라고 가정하면, 20번이 불리는 것은 아니라.. (강의에서 말씀드렸지만) 필요한 경우 (애니메이션으로 인해 오토레이아웃의 업데이트가 필요하거나 등..) 특정한 상황에서만 1번 호출이 됩니다.
(그러고 보니, 1초에 20번 호출될 가능성이 있다고 표현하는게 더 맞겠네요.)

(뷰의 제약이 업데이트 되었다는 것을 알려주는 것이 필요한 경우... 대부분 호출이 되지 않다가, 이것을 강제적으로 호출되어야 한다는 것을 알려주는 것이 setNeedsUpdateConstraints( ) 라는 메서드라고 말씀을 드렸고요.) 그래서 일반적으로 애니메이션 등의 효과를 원할때, 레이아웃의 전체적인 배치까지 포함해 layoutIfNeeded( )를 호출하게 됩니다.
따라서 80개가 활성화되는 건 아닙니다. 애니메이션 등, 어떤 오토레이아웃 조건의 변화가 필요할 때 해당 조건을 업데이트 하기 위한 목적으로 사용하는 거예요.


아래와 같이 애니메이션을 변경하기 위한 코드의 경우도

UIView.animate(withDuration: 2) {
     self.view.layoutIfNeeded()
} completion:  { success in
     print("애니메이션 처리 완료")
}

layoutIfNeeded( )의 코드로 인해 layoutSubview( ) 가 2초 동안 (2 X 20 => 40번 호출되는 것이 아니라)... (2초동안 길게) 1번 호출이 되어, 내부적인 메커니즘에 의해 중간 중간의 변화 표시를 위한 그림(변화 처럼 보이기 위해 중간 중간 변화를 끈어서.. 변화되는 것처럼)을 다시 그릴 뿐입니다.



2. 답변
네, 일반적인 경우 생성자(init) 에서 오토레이아웃을 설정하는 것이 맞습니다. 일반적이라고 말씀드리는 건, 보통의 오토레이아웃을 잡는 경우, 애니메이션도 필요 없고, 대부분의 앱에서 일어나는 일이라고 보시면 됩니다.

그래서 대부분 init( ) 내부에서 오토레이아웃을 설정하게 되는 것이 맞고, 해당 강의에서는.. 뷰의 드로잉 사이클을 설명드리기 위해, 오토레이아웃의 업데이트 등이 있는 특별한 경우를 가정하고 설명드리고 있다고 보시면 됩니다.

 

감사합니다. :)

Pooo님의 프로필

Pooo

질문자

2023.11.06

혹시 밑의 댓글에 답변 가능하실까요? 질문이 많아 죄송합니다!ㅜ