개발+IT

텍스트 양과 UILabel의 Size 등을 비교할 때 주의할 점

사실 UILabel에 국한되는 것은 아니지만...

텍스트가 많이 들어가는 UI를 구현하다 보면 텍스트가 차지하는 영역과 해당 텍스트를 표기할 뷰가 차지하는 영역을 비교해서 뷰의 설정 등을 동적으로 변경해야 하는 경우가 생긴다. 예를 들어 A라는 UILabel이 있고, B라는 UILabel이 있는데, A에 텍스트를 넣어서 2줄 이상이 표기될 경우 B에는 1줄만 표기하고, A에 들어간 텍스트가 1줄일 경우 B는 2줄 이상이 표기되도록 하는 식이다.

이런 경우엔 a에 들어갈 내용을 NSAttributedString으로 변환해서 size() 함수로 변환해 받아온 CGSize와 a의 실제 CGSize를 비교하면 어렵지 않게 구현할 수 있다.

대충 이런 식이다. 그런데 문제는 이 다음에 발생했다.

이런 형태의 UI를 UITableViewCell 내부에 구현해서 넣어놨는데, 이게 UITableView가 최초로 보여지는 영역에 포함된 UITableViewCell만 제대로 작동하질 않는게 아닌가. 스크롤해서 사라지게 했다가 다시 나타나게 하면 그제서야 제대로 적용되는 것이다. 도대체 이게 무슨 문제인가 하고 보는데 최초로 등장하는 UITableViewCell에서 비교대상이 되는 UILabel.frame.size가 가로 세로 모두 0인 채로 오는 게 문제였다. 그러니 조건식이 제대로 작동하지 못할 수 밖에. 곰곰히 생각해보니 최초 로딩시에는 문제의 UILabel이 아직 레이아웃이 되질 않아 자기자신이 차지하는 영역을 알지 못하기 때문에 사이즈가 0으로 인식되는 것 같았다. 그렇다면 최초에 강제로 레이아웃을 시켜주면 해결되겠지? 그래서 다음과 같이 고쳐보았다.

새로 추가된 구문이 보이는가? UILabel의 frame.size가 0일 경우 해당 UILabel이 레이아웃이 필요함을 선언하고, 그 직후 레이아웃을 실행하는 함수를 추가해주었다. 그러고 나니 이 이후부터는 문제가 발생하지 않았다. 해결하고보니 어려울 것 없는 문제인데, 이유를 모르는 상태에서는 꽤나 당혹스러운 문제였다. 여튼 뭐...어떻게든 해결했으니, 비슷한 문제를 겪는 분들에게 도움이 되면 좋겠다.

GAE BAL JA

구본본 님의 창작활동을 응원하고 싶으세요?

hell yeah, world
hell yeah, world
구독자 101
멤버십 가입

0개의 댓글

SNS 계정으로 간편하게 로그인하고 댓글을 남겨주세요.
새로운 알림이 없습니다.