인프런 커뮤니티 질문&답변

듀듀님의 프로필 이미지
듀듀

작성한 질문수

앨런 iOS 앱 개발 (15개의 앱을 만들면서 근본원리부터 배우는 UIKit) - MVVM까지

활용-11 앱 / 어떤 앱을 만들게 될지 (활용 앱89강)

테이블 뷰 셀에서 라운드를 주는 것을 layoutSubview에 넣으면 안되나요?

작성

·

126

0

안녕하세요

코어데이터를 이용해서 메모장 만드는 것 듣다가 궁금해서 질문합니다.

 

다른게 아니고 backview에 라운드 주는 걸 init() 메서드 안에 말고 layoutSubviews에 넣어도 동작하더라구요

 

근데 왜 detailView에서 버튼은 init이 아니라 layoutSubview에 넣어야 되나요??

 

추가로 layoutSubviews를 자주 호출하면 버벅인다고 하는데? 그래서 init()에 넣는건가요?

 

답변 2

0

듀듀님의 프로필 이미지
듀듀
질문자

상세한 답변 감사합니다.

머리 속에 둥둥 떠다니는 개념이 확 다시 들어오네요 ~

0

앨런(Allen)님의 프로필 이미지
앨런(Allen)
지식공유자

네 안녕하세요 듀듀님.

결론부터 말씀드리면.. 앱을 만드실때..
뷰컨트롤러, 뷰의 사이클 등은..

1) 정확한 시점 (뷰를 그리는 것 포함)
2) (또한 어떤 메서드에 대한) 재호출 여부 (여러번 호출되는지, 한번만 호출되는지)

이것들을 잘 고려하셔야 합니다. 그리고 앱 만들기 활용 45강 ~ 50강까지, 이미 자세하게 설명드렸으니.. 기억이 안 나시거나 헷갈리시는 내용이 있으시면.. 꼭 다시한번 시청 부탁 드립니다 🙏🏻

그래서,
layoutSubviews가 무엇을 하는 곳인지 먼저 명확한 이해가 선행되셔야 합니다.

 

오토레이아웃이라는 시스템은, 오토레이아웃 설정(제약)에 따라
1) (오토레이아웃 기반) 계산 -> 2) (계산후) 배치 -> 3) (뷰 내용 다시 그리기)

이런 내부적인 일들이 일어납니다. layoutSubviews라는 건 2번에 해당하는 (오토레이아웃 계산 후) 하위뷰들을 레이아웃(배치) 하는 일과 관련된 일들을 하는 "시점"을 의미합니다.
(화면을 돌리거나, 오토레이아웃이 업데이트 되면.. 배치를 다시 해야 되니까, 경우에 따라서 layoutSubviews는 여러번 호출 될 수도 있습니다.)


자, 이제 질문하신 내용에 대해 답변드리면,
backview에 라운드 주는 것은...
예를 들어서 아래와 같이, 정확하게 10라고 명확하게 숫자로 입력하는 것은

backgroundView.layer.cornerRadius = 10


init() 메서드에 넣어도 되고, layoutSubviews에 넣어도 됩니다. (이미 정확한 숫자값이 있으니까요.)
숫자 값으로 설정하니, 화면의 크기 등에 따라서 추가적으로 계산할 필요가 없다는 뜻이기도 하고, 정해져 있으니.. 여러번 호출해서는 안되니.. 사실 init() 에 넣는게, 더 논리적으로 맞겠죠.


그런데 투두앱 프로젝트 내의 디테일뷰의 버튼의 경우.. 화면 내에서 계산이 필요합니다.
왜냐하면, 코드를 보시면..

button.layer.cornerRadius = button.bounds.height / 2

button.bounds (버튼 자신의 크기)의 height 높이를 기반으로 해서, 그것을 정확하게 반으로 나누기 때문에 (디자인 상.. 정확하게 반원으로 둥글게 표현하기 위해) 버튼의 높이를 기준으로 계산하기 때문입니다.

그렇다면 버튼의 크기가 언제 결정되냐?
버튼의 실제 크기는 오토레이아웃을 통한 계산 후.. 배치까지 일어난 후에 알 수 있습니다. (아이폰미니, 아이폰15, 아이폰 15 프로맥스 등 화면 크기가 다 다른데.. 오토레이아웃은 "제약" (10떨어질 것인지 / 20떨어질 것인지 등)을 기반으로 해서 (1)계산이 다시 일어나고, 계산에 따라 (2) "하위뷰들의 배치까지 완료되는 시점"에 버튼의 높이를 정확하게 알 수 있는 것입니다. 그래서 여기에서는 그 명확한 시점 이후에 버튼을 둥글게 깍을 수 있는 것이라고 보시면 됩니다.

만약에 높이를 기준으로 둥글게 깍는게 아니라

button.layer.cornerRadius = 15

이런식으로 코드를 짜신다면, init( )에 넣으시면 됩니다. 그러면 여러번 호출될 필요도 없고, 처음부터 결정이 되어버리는 것이니까.. 이게 편하긴 하겠죠.
(다만, 디자인적으로는.. 미니에서는 완전 둥글게 보일 수도 있고, 아이폰 맥스 화면에서는 덜 둥글게 보일 수도 있습니다. 고정 값으로 15를 선택하고 있으니, 화면 크기에 따라 버튼 크기도 달라지고, 버튼 크기는 다른데 깍는 값은 15로 일정하니 다르게 보일 수 있다는 의미라고 보시면 됩니다.)


따라서, 어쨌든 여기서는 버튼 높이를 기준으로 디자인적인 요소를 고려해서
"정확하게 반원으로 둥글게 깍고 싶기 때문에" (귀찮지만..) 뷰들의 시점을 고려한 코드를 짰다고 보시면 될 것 같습니다.

결론적으로 원하는 디자인 구현에 따라서, 시점을 결정한 코드라고 보시면 될 것 같습니다.

 

감사합니다. :)

듀듀님의 프로필 이미지
듀듀

작성한 질문수

질문하기