티스토리 뷰

반응형

 

 

 


layoutIfNeeded()

layoutIfNeeded() 메서드는 특정 UIView의 레이아웃의 업데이트가 대기상태일 경우, 즉시 해당 레이아웃을 업데이트 해줍니다.


UIView의 뷰 업데이트 과정에는 뷰 업데이트 사이클이 존재합니다.

만약 즉시 뷰를 업데이트할 필요가 없을 경우에는 layoutIfNeeded 메서드 대신, setNeedsDisplay 메서드를 통해 현재 그래픽 상태가 업데이트 되어야함을 시스템에 알려준 뒤
-> 다음 뷰 업데이트 주기가 되면 뷰의 draw(CGRect) 메서드를 호출해서 현재 뷰의 모습을 업데이트 시켜줄 수 있는데요.


setNeedsDisplay()와 달리, layoutIfNeeded() 메서드를 사용하면, 뷰 업데이트 사이클 대기를 하지않고 즉시 뷰 업데이트를 진행합니다. 


이어서 layoutIfNeeded() 메서드의 선언방식을 알아보겠습니다. 

 

 


Declaration
선언방식

 

 


layoutIfNeeded() 메서드는 setNeedsDisplay() 메서드와 같이 UIView의 인스턴스 메서드 중 하나입니다.


앞서 말했듯이, 해당 메서드를 특정 UIView의 레이아웃을 즉시 업데이트 하고자 할때, 강제로 업데이트 하고자 할 때 사용할 수 있습니다. 


iOS 개발 간 오토 레이아웃을 사용할 때, 레이아웃 엔진은 제약 상의 변경을 만족 시키기 위해서 필요에 따라 뷰의 위치를 업데이트 하게 됩니다.

루트 뷰로부터 특정 메세지를 받은 뷰를 사용해서 해당 메서드 layoutIfNeeded()는 루트뷰부터 시작해서 서브뷰들까지 차례대로 업데이트를 시작하게 됩니다. 

만약 layoutIfNeeded() 메서드를 호출 한 후 업데이트를 하려했을 때, 대기중인 뷰 업데이트 사항이 존재하지 않는다면, 해당 메서드는 현재 뷰의 어떠한 레이아웃 변화나 레이아웃 관련 콜백도 일으키지 않고 실행을 종료하게 됩니다.

그래서 메서드 이름이 layoutIfNeeded() 인 것이겠죠?  😄

 

 


개발자가 UIView를 업데이트 하고, 다시 그리고자 할 때, 뷰를 그리는 메서드인 draw(_ rect: CGRect) 메서드를 호출해서 업데이트를 하게 되는데요. 


애플 공식 문서에서 "개발자는 draw(CGRect)를 직접 호출해서는 안됩니다." 라고 하고 있습니다.


개발자는 다음 업데이트 주기에 뷰 업데이트를 처리하도록 setNeedsDisplay()를 사용하거나, 즉시 업데이트 하기위해 layoutIfNeeded()등, 업데이트에 사용 되는 별도의 메서드를 사용해서 draw(CGRect) 메서드를 간접적으로 호출시켜야합니다.

 

 

 


즉, 현재 업데이트를 원하는 뷰를 즉시 혹은, 다음 업데이트 주기에 업데이트 하는 다양한 목적의 메서드가 존재하며, 그 업데이트에 사용하는 메서드 중 하나가 바로 layoutIfNeeded() 메서드가 되겠습니다.

그리고 layoutIfNeeded()는 다음 업데이트 주기를 기다리지 않고, 바로 뷰를 업데이트 시키는 메서드가 되는 것입니다. 

뷰를 바로 업데이트 시킬 수 있지만, 반드시 즉시 업데이트 할 상황이 아니라면, 비효율적인 리소스 낭비를 줄이기 위해 layoutIfNeeded() 메서드의 사용을 지양할 필요가 있습니다.

그 대신, 다음 뷰 업데이트 주기에 업데이트를 시키도록 시스템에 요청하는 setNeedsDisplay() 메서드 등을 고려할 수 있겠습니다.

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함