새싹

iOS CustomView 만들때 super.init(frame: frame)만 가능한 이유

Thor_yeom 2023. 8. 24. 19:22

 

로직 분리를 위해 CstomView를 만들때 

init(frame:CGRect)를 호출하는데

 

왜 super.init(frame: frame)에 frame을 넣는지 궁금했다.

 

※ 여기서 잠깐

 

CGRect에 대해 알고 계신가요?

CGRect는  origin과 size로 구성되어 있습니다.

origin:  x, y 좌표

size:  width, height 

 

UIView 메소드의 정의를 확인해보니

extension으로 frame이 자료형으로 CGRect로 구성되어 있는 것을 볼 수 있습니다.

 

아! 자료형이 같으니까 넣을 수 있겠구나

override init(frame: CGRect) {
// frame: CGRect로 구성되어 있음 
        super.init(frame: frame) 
}

아니... 그래서 frame이 뭐냐고 ㅋㅋㅋㅋㅋ

frame의 자료형이 CGRect인건 알겠는데 왜 frame만 사용하는거지?

뭐 그러면 자료형이 CGRect로 구성되어 있는거면 아무거나 갖다써도 되는거야 뭐야...

 

공식 문서 보니까 자료형인 CGRect로 구성되어 있는 것이 

두가지 이었다.

그렇다면 bounds를 써도 똑같은가? 

안된다...

아니 같은 CGRect로 되어 있는데 왜 안되는거지?? 

라는 꼬리 질문 속에 bounds와 frame의 차이에 대해 알아보았다.

 

※ 여기서 잠깐

 

bounds와 frame의 차이에 대해 아시나요?

홍박사님은 잘 아는데 말이야..흠흠

간단하게만 짚고 넘어갈게요... 내용이 워낙 방대하네요 ㅎㅎ  추후에 자세하게 포스팅하겠읍니다..

 

이것 또한 공식문서에 잘 나와있다 짧은 영어실력으로 나름 해석해보았다.

일단 bounds에 대한 공식문서를 보면

나름 해석: 잘은 모르겠지만... 가장 작은 사각형인거라고 하고, 컨텐츠의 너비를 나타낸다...

이정도면 됐어! ㅋㅋㅋ



결론 : 가장 작은 직사각형의 경계를 나타낸다! 

=> 가로랑 세로 값이 있어야한다.

 

오류가 나는 이유:

가로 세로 길이를 아직 정의해주지 않았는데

어떻게 직사각형을 만들어요... ( feat. 양배추 안불렀는데 어떻게 가요...)

 

 

그렇다면 frame에 대해 공식문서를 찾아보자

나름해석 : 이것도 뭐가 많네...   프레임 직사형이고 뷰의 위치와 사이즈, 슈퍼 뷰의 좌표 시스템



중요한 부분은 슈퍼 뷰의 좌표 시스템, 뷰의 위치와 사이즈 인데요

 

결론만 먼저 말하자면

frame을 부르면 해당 뷰의 슈퍼뷰에서 뷰의 위치와 사이즈를 가져온다.

아 몰랑 일단 이것만 알아둬

 

 

정리하자면

bounds와 frame의 차이의 핵심은

 

bounds는 값이 정의 되어있어야하고 ( 즉, View 영역 그 잡채...)

frame은 슈퍼뷰에서 얼마나 떨어져 있고(origin), 사이즈(size)가 어떻게 되냐 ( 즉, Super View의 좌표계 )

 

 

다시 본론으로 돌아와서

그렇기 때문에 frame만 사용 가능합니다. 

 

 

자 그렇다면 UIView에서 frame에 어떻게 정의 되어 있는지 찾아보겠읍니다.

아이고... 잘도 숨겨놨다 눈이 안봬...

 

나름 해석: orgin(x,y좌표) 가 디폴트로 0으로 되어 있다. 프레임 크기, 애니메이션 가능하다.

이게 무슨 말이냐면 모든 UIView는 왼쪽 상단부터 시작한다는 뜻임 -> 이게 디폴트임

 

 

그렇다면 이 코드를 분석해보면

부모(UITextField)에서 정의 한 init(frame: CGRect)를 

다시 재정의 하는데

 

기준을  슈퍼뷰의 왼쪽 상단 (0.0)이고 사이즈도 가져올것이다.

이 문장을 말하고 싶어서 머나먼 여정을 거쳐왔습니다 흑흑 

슈퍼뷰의 사이즈는 CustomViewController에서 레이아웃 정의!!

 

그렇다면 configureView()를 통해

Custom으로 만든 BlackRadiusTextField에 어떻게 구성되는 속성을 정의해주고

 

VC에서 BlackRadiusTextField의 인스턴스를 만들어 주고 

레이아웃만 조정해주면 끝!

 

이렇게

init(frame: CGRect)에 frame이 들어가는지에

대해서 정리를 해봤는데요...

 

 

 

 

 

정리를 하면 할 수록 배워야 할 것들이 많다는 것을 느꼈습니다.

이상 대신해보고 먼저해보는 아무개염 이었습니다 ㅎㅎ

 

 

 

 

더 알아봐야 할 부분

https://babbab2.tistory.com/44

 

iOS) Frame vs Bounds 제대로 이해하기 (1/3)

안녕하세요 :D 소들입니다 후후......... 오늘은 Frame과 Bounds에 대해 알아볼 거예욥...! 그 있잖음.. UIView에 등장하는 두 놈... 이전 포스팅 에서 CGRect는 View의 위치(origin)와 크기(size)를 나타내기 위해

babbab2.tistory.com