본문 바로가기
Swfit

frame .zero로 설정하는 이유?

by GGShin 2022. 10. 31.

YT 강의를 보다보면, 간혹 UIView를 선언할 때 frame을 .zero로 설정하는 경우를 보았습니다. 

이후에 layout을 그려주기 위한 function을 하단에 정의하고 viewDidLayoutSubviews() function에 해당 layout 함수를 호출해주는 방식으로 코드를 작성하더라구요. 애초에 선언할 때 frame을 정의하면 되지 않는가 라는 생각이 들었는데, 이유가 있을 것 같아서 한 번 구글링을 해보았습니다. 

정확한 답변인지는 아리송하지만, 대략적인 이유에 대해서는 알게된 것 같아서 글로 남겨보려고 합니다.

 

먼저 제가 궁금했던 부분이 어떤 것인지 정확히 얘기해보자면, 아래처럼 UIView를 상속하는 property들은 대개 frame을 argument로 받는 initializer가 있습니다. 

이 frame은 CGRect type입니다. CGRect는 직사각형의 location과(x, y좌표) dimensions(width, height) 정보를 담고 있는 구조체 입니다!

 

CGRect에 static으로 정의된 zero라는 property가 있는데, 이는 origin(x,y cooridinate)과 size가 모두 0인 경우입니다.

 

 

결국, 특정한 UIView property의 frame을 .zero로 설정해둔다는 것은 super view의 좌표를 기준으로 해서 x = 0, y = 0, width = 0, height = 0인 직사각형으로 설정한다는 의미와 동일합니다. 

제 의문은 왜 보이지도 않는 사이즈에 원하는 좌표가 아닌 곳에 위치하게되는 UIView를 선언하냐 였습니다. 선언할 때부터 원하는 위치, 사이즈를 설정하는게 낫지 않은가 하는 생각이었습니다.

관련해서 검색을 해보았고, 유사한 질문에 대한 답변이 있어 확인해 보니 다음과 같았습니다.

 

The frame does not matter at UIView creation time.

frame이 어떻게 설정되어 있는지는 UIView 생성 시점에는 영향을 미치지 않습니다.

 

라는 설명이었습니다. 결국 어떻게 설정하던지 이후 frame 설정에 영향을 받기 때문에 선언 시에는 편의상(?) .zero로 설정하고 이후에 layout을 따로 설정해주는 것이 아닌가 하는 생각이 들었습니다. 

 

또 한가지 관련이 약간 있는 스택오버플로우의 질문과 답변은 다음과 같았습니다.

 

 If you are adding the subview, say, in viewDidLoad, then the UIViewController hasn't make any calculation for the frames. 

 

viewDidLoad에 subview를 추가할 때, UIViewController는 아직 frame에 대한 계산을 수행하지 않은 상태입니다. 

 

viewDidLayoutSubviews is the point where the frame calculations has already been done and it's safe to access them. You can even calculate some frames yourself after the super call.

viewDidLayoutSubviews는 frame 계산이 이미 완료된 시점이고, frame에 접근하기 안전한 타이밍 입니다. super call 이후에 frame 계산을 추가할 수도 있습니다

 

결국에는 UIView의 선언 초기에는 frame 설정이 크게 영향을 주지 않으니, 이후에 설정해주는 것이 유튜버가 사용한 방식이 아닌가 하고 결론을 내려봅니다. 

 

혹시나 부가적인 설명이나, 정확한 이유를 알고계신 분이 계시다면 알려주시면 감사하겠습니다 :)


참고자료

 

https://stackoverflow.com/questions/51178505/position-of-a-view-with-zero-frame

 

Position of a view with .zero frame

I have a view (VIEW A). I need to get it's position inside of it's superview (ideally a CGPoint for it's Center X and Center Y). This would be easy, except that when I add VIEW A into the view, I...

stackoverflow.com

https://developer.apple.com/forums/thread/130614

 

Why is arView = ARView(frame: .zer… | Apple Developer Forums

I typically set the frame to zero when making UIKit apps too (non SwiftUI), and later set the frame like this: self.arView.frame = self.view.bounds self.arView.autoresizingMask = [.flexibleWidth, .flexibleHeight] I'm not extremely knowledgeable about UIKit

developer.apple.com

 

 

반응형

'Swfit' 카테고리의 다른 글

Cannot find AF in scope - Alamofire 관련 에러  (0) 2022.11.10
Protocol extension  (0) 2022.11.02
Method(메서드)란?  (0) 2022.10.25
UIImageView - clipsToBounds 설정 사진으로 차이 알아보기!  (0) 2022.10.21
XCode 단축키 모음  (0) 2022.10.21