λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
🍎 iOS/UIKit

[iOS] View 체계 - Window&View, Frame vs Bounds, 디버깅 툴

by Danna 2021. 6. 16.
728x90
728x90

iOS의 View 체계 - λ·° 계측, 뷰의 μ’Œν‘œ, ν”„λ ˆμž„ vs λ°”μš΄λ“œ, λ·° 계측 디버깅 툴


 

iOS μ•± ν”„λ‘œκ·Έλž˜λ°

λΆ€μŠ€νŠΈμ½”μŠ€ 무료 κ°•μ˜

www.boostcourse.org

 

1μž₯μ—μ„œ μŒμ•…μž¬μƒ 앱을 λ§Œλ“€λ©΄μ„œ μ•„λž˜μ˜ λ‚΄μš©λ“€μ„ ν•™μŠ΅ν–ˆμŠ΅λ‹ˆλ‹€.

 

  • 에셋(Asset) - μ•± μ•„μ΄μ½˜, 이미지 파일, 데이터 νŒŒμΌμ„ 관리, μ•± μ‹€ν–‰μ‹œ νŒŒμΌμ— μ‰½κ²Œ μ ‘κ·Όν•  수 μžˆλ„λ‘ 도와쀀닀.
  • μ•± μ‹œλ‹(App thinning)κ³Ό μ•± μŠ¬λΌμ΄μ‹±(App slicing) - λ‹€μ–‘ν•œ λ””λ°”μ΄μŠ€μ—μ„œ λΉ λ₯΄κ²Œ λ‹€μš΄λ‘œλ“œν•  수 μžˆλ„λ‘ ν•˜λŠ” μ΅œμ ν™” 기술 
  • Cocoa Touch, UIKit, Foundation - iOS μ•± κ°œλ°œμ— ν•„μš”ν•œ ν”„λ ˆμž„μ›Œν¬ 
  • Autolayout μ„ μ μš©ν•˜λ©° UIλ₯Ό κ°œλ°œν•˜λŠ” λ²• - μΈν„°νŽ˜μ΄μŠ€ λΉŒλ” vs μ½”λ“œλ‘œ μž‘μ„±
  • iOS의 View 체계 - λ·° 계측, 뷰의 μ’Œν‘œ, ν”„λ ˆμž„ vs λ°”μš΄λ“œ, λ·° 계측 디버깅 툴
  • λ””μžμΈ νŒ¨ν„΄κ³Ό MVC νŒ¨ν„΄ - μ‹±κΈ€ν„΄ νŒ¨ν„΄κ³Ό μ•±κ°œλ°œμ—μ„œμ˜ MVC νŒ¨ν„΄μ„ μ€‘μ μ μœΌλ‘œ
  • AVAudioPlayer, Timer - μŒμ•… νŒŒμΌμ„ μž¬μƒν•˜κΈ° μœ„ν•œ AVAudioPlayer, μ‹œκ°„μ΄ˆλ₯Ό 재기 μœ„ν•œ Timer

πŸ‘€ iOS μ•±μ—μ„œ 컨텐츠λ₯Ό 보여주기 μœ„ν•œ Window & View

  • iOS μ•± ν™”λ©΄μ—μ„œ λ³΄λŠ” μ½˜ν…μΈ λŠ” Window 와 View λ₯Ό μ‚¬μš©ν•΄ λ‚˜νƒ€λ‚Έλ‹€.
  • Window λŠ” κ·Έ 자체둜 μ½˜ν…μΈ λ₯Ό ν‘œν˜„ν•  수 μ—†μ§€λ§Œ, View λ₯Ό μœ„ν•œ μ»¨ν…Œμ΄λ„ˆ 역할을 ν•œλ‹€.
  • View λŠ” UIView 클래슀 ν˜Ήμ€ ν•˜μœ„ν΄λž˜μŠ€μ˜ μΈμŠ€ν„΄μŠ€λ‘œ Window 의 ν•œ μ˜μ—­μ—μ„œ μ½˜ν…μΈ λ₯Ό 보여쀀닀.
  • View λŠ” 이미지, 문자, λ„ν˜•, 또 λ‹€λ₯Έ λ·° λ“±μ˜ μ½˜ν…μΈ λ₯Ό λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€.
  • View λŠ” gesture recognizer λ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ ν„°μΉ˜ 이벀트λ₯Ό μ²˜λ¦¬ν•  수 μžˆλ‹€.
  • View λŠ” λ·° 계측(View hierarchy) κ΅¬μ‘°μ—μ„œ λΆ€λͺ¨λ·°μ™€ μžμ‹λ·°μ˜ μœ„μΉ˜μ™€ 크기λ₯Ό κ΄€λ¦¬ν•œλ‹€.
πŸ’‘ View λŠ” iOS μ•±μ—μ„œ 컨텐츠λ₯Ό 보여주기 μœ„ν•œ ν•„μˆ˜ μš”μ†Œλ‘œ, 이미지, 문자, λ„ν˜•, 또 λ‹€λ₯Έ λ·° λ“±μ˜ μ½˜ν…μΈ λ₯Ό 보여쀄 수 μžˆλ‹€. View κ³„μΈ΅μ˜ μ΅œμƒλ‹¨μ€ UIWindow 객체둜, μ‹œκ°μ μœΌλ‘œ ν‘œν˜„λ˜μ§€ μ•Šμ§€λ§Œ View λ₯Ό μœ„ν•œ μ»¨ν…Œμ΄λ„ˆ 역할을 ν•œλ‹€.

 

βœ”οΈŽ λ·° 계측 (View hierarchy) ?

View λŠ” μžμ‹ μ˜ μ½˜ν…μΈ λ₯Ό 보여주기도 ν•˜μ§€λ§Œ, λ‹€λ₯Έ λ·°λ₯Ό μœ„ν•œ μ»¨ν…Œμ΄λ„ˆλ‘œμ¨μ˜ 역할도 ν•œλ‹€. λ§Œμ•½ νŠΉμ • λ·°κ°€ μ»¨ν…Œμ΄λ„ˆ 뷰둜 λ‹€λ₯Έ λ·°λ₯Ό 포함할 λ•Œ, λΆ€λͺ¨ - μžμ‹ 관계가 생기며, μ΄λŸ¬ν•œ 것을 λ·° 계측이라고 ν•œλ‹€.

  • Sub View κ°€ 뢈투λͺ…ν•œ 경우 -> Super view κ°€ Sub view 에 가렀진닀.
  • Sub View κ°€ 반투λͺ…ν•œ 경우 -> Super view 와 Sub view κ°€ ν•¨κ»˜ 보여진닀.
πŸ’‘λΆ€λͺ¨ λ·° = Super view, μžμ‹ λ·° = Sub view

 

Sub View κ°€ μ—¬λŸ¬κ°œμΈ 경우? 

Super View λŠ” ν•˜λ‚˜μ˜ 배열에 μ—¬λŸ¬ 개의 Sub view λ₯Ό μˆœμ„œλŒ€λ‘œ μ €μž₯ν•œλ‹€. λ§Œμ•½ ν•˜λ‚˜μ˜ Super view 에 뢈투λͺ…ν•œ sub view 두 κ°œκ°€ κ²ΉμΉœλ‹€λ©΄, λ‚˜μ€‘μ— μΆ”κ°€λœ sub view κ°€ 맨 μœ„μ— 보인닀. 두 sub view λͺ¨λ‘ 반투λͺ…ν•œ 경우 λͺ¨λ“  λ·°κ°€ μ„žμ—¬λ³΄μ΄κ²Œ λœλ‹€.

 

βœ”οΈŽ λ·° 계측을 λ§Œλ“œλŠ” 방법?

Autolayout 을 μ§€μ •ν•˜λŠ” κ²½μš°μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ, λ·° 계측을 λ§Œλ“œλŠ” 방법도 μΈν„°νŽ˜μ΄μŠ€ λΉŒλ”(Storyboard)λ₯Ό μ΄μš©ν•˜λŠ” 방법, μ½”λ“œλ‘œ μž‘μ„±ν•˜λŠ” 방법 두 가지가 μžˆλ‹€. 

 

μ½”λ“œλ‘œ λ·° 계측 생성/κ΄€λ¦¬ν•˜κΈ°

 

  • Sub View λ₯Ό SuperView 에 μΆ”κ°€ν•˜κΈ° :: SuperView.addSubView(_:) λ©”μ„œλ“œ 호좜
    μΆ”κ°€λœ μ„œλΈŒλ·°λŠ” 슈퍼뷰의 μ„œλΈŒ λ·° λͺ©λ‘ 맨 λ§ˆμ§€λ§‰μ— μΆ”κ°€λœλ‹€.
    μ„œλΈŒ λ·° λͺ©λ‘μ˜ νŠΉμ • μΈλ±μŠ€μ— μ‚½μž…ν•˜κ³  싢을 경우, SuperView.insertSubView(_at:) λ©”μ„œλ“œλ₯Ό 이용
  • SuperView μ—μ„œ SubView μ œκ±°ν•˜κΈ° :: SubView.removeFromSuperView() λ©”μ„œλ“œ 호좜
  • SuperView 의 μ„œλΈŒ λ·° λͺ©λ‘μ„ μ •λ ¬ν•˜κΈ° :: bringSubView(toFront:), sendSubView(toBack:) λ©”μ„œλ“œλ₯Ό 이용

 

μΈν„°νŽ˜μ΄μŠ€ λΉŒλ”λ₯Ό μ΄μš©ν•΄μ„œ λ·° 계측 생성/κ΄€λ¦¬ν•˜κΈ°

 

  • UI 객체 λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ 기쑴의 View 객체둜 λ“œλž˜κ·Έμ•€ λ“œλžμœΌλ‘œ λ·° 계측을 μΆ”κ°€ν•œλ‹€.
  • νŒŒλž€μƒ‰ SuperView 내에 SubView λ‘œλŠ” Label, View κ°€ μ‘΄μž¬ν•œλ‹€.
  • 흰색 SubView λŠ” Label 의 SuperView κ°€ λœλ‹€.

 

μΈν„°νŽ˜μ΄μŠ€λΉŒλ”λ‘œ λ·° 계측 ν™•μΈν•˜κΈ°

 

πŸ€” μΈν„°νŽ˜μ΄μŠ€ λΉŒλ”μ—μ„œ View Controller 객체λ₯Ό μΆ”κ°€ν•˜λ©΄ μ™œ View κ°€ μžλ™μœΌλ‘œ μΆ”κ°€λ κΉŒ?

 

UIViewController λŠ” 슀슀둜 화면에 ν‘œμ‹œλ˜λŠ” 객체가 μ•„λ‹ˆλ―€λ‘œ, μžμ‹ μ΄ 관리할 (μ½˜ν…μΈ λ₯Ό 보여쀄) View λ₯Ό λ°˜λ“œμ‹œ κ°–κ³  μžˆμ–΄μ•Όν•œλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μΈν„°νŽ˜μ΄μŠ€λΉŒλ”μ—μ„œ View Controller 객체λ₯Ό μΆ”κ°€ν•  경우, View κ°€ μžλ™μœΌλ‘œ μΆ”κ°€λœλ‹€.


✏️ View 의 μ’Œν‘œκ³„μ™€ Frame vs Bounds

  • UIKit μ—μ„œ κΈ°λ³Έ μ’Œν‘œκ³„λŠ” 쒌츑 상단 λͺ¨μ„œλ¦¬λ₯Ό μ›μ μœΌλ‘œ ν•˜λ©°, μ›μ μœΌλ‘œλΆ€ν„° μ•„λž˜μͺ½, 였λ₯Έμͺ½μœΌλ‘œ 갈수둝 값이 컀진닀.
  • View 의 ν”„λ ˆμž„(Frame) 은 View 의 크기와 μœ„μΉ˜λ₯Ό SuperView 의 μ’Œν‘œκ³„λ₯Ό κΈ°μ€€μœΌλ‘œ λ‚˜νƒ€λ‚Έλ‹€.
  • View 의 λ°”μš΄λ“œ(Bounds) λŠ” View 의 크기와 μœ„μΉ˜λ₯Ό ν•΄λ‹Ή λ·° μžμ‹ μ˜ μ’Œν‘œκ³„λ₯Ό κΈ°μ€€μœΌλ‘œ λ‚˜νƒ€λ‚Έλ‹€.
  • View λ₯Ό νšŒμ „ν•  경우, Frame 은 변경될 수 μžˆμ§€λ§Œ, Bounds λŠ” λ³€κ²½λ˜μ§€ μ•ŠλŠ”λ‹€.

View Programming Guide for iOS

 

  • μ•„λž˜ μ΄λ―Έμ§€μ—μ„œ SubView 의 Frame 값을 보면, SuperView κΈ°μ€€μœΌλ‘œ 값이 λ‚˜νƒ€λ‚˜λŠ” 것을 확인할 수 μžˆλ‹€.
  • SubView 의 Frame μ’Œν‘œλ₯Ό (0, 0) 으둜 μ„€μ •ν•˜λ”λΌλ„, SuperView λ°–μœΌλ‘œ λ²—μ–΄λ‚˜μ§€ μ•ŠλŠ”λ‹€. 
  • SuperView 의 Frame 값은 μ΅œμƒλ‹¨ View 인 원점 μ’Œν‘œκ³„ κΈ°μ€€μœΌλ‘œ 값이 λ‚˜νƒ€λ‚  것이닀.

Frame κ°’ 더 μžμ„Έν•˜κ²Œ 확인해보기!

 

βœ”οΈŽ View 의 Frame, Bounds λŠ” CGRect λΌλŠ” ꡬ쑰체λ₯Ό 톡해 ν‘œν˜„λœλ‹€.

 

  • CGRect :: μ‚¬κ°ν˜•μ˜ 크기와 μœ„μΉ˜μ— λŒ€ν•œ 정보λ₯Ό λ‹΄κ³  μžˆλŠ” ꡬ쑰체
    * CGRect :: (x, y, width, height) 
  • CGRect.origin (property) :: CGPoint νƒ€μž…μœΌλ‘œ μ‚¬κ°ν˜•μ˜ μ‹œμž‘μ μ„ μ €μž₯ν•˜κ³  μžˆλ‹€.
    * CGPoint :: (x, y) κ°’μœΌλ‘œ μ’Œν‘œ ν‘œν˜„
  • CGRect.size (property) :: CGSize νƒ€μž…μœΌλ‘œ μ‚¬κ°ν˜•μ˜ 높이와 λ„ˆλΉ„λ₯Ό μ €μž₯ν•˜κ³  μžˆλ‹€.
    * CGSize :: (width, height) κ°’μœΌλ‘œ 크기 ν‘œν˜„
λ·°λ₯Ό μ •μ˜ν•˜κΈ° μœ„ν•΄μ„œλŠ” 1) λ·°κ°€ 어디에 κ·Έλ €μ Έμ•Ό 할지, 2)  λ·°κ°€ μ–΄λ–€ 크기둜 κ·Έλ €μ Έμ•Ό ν•  지 μ•Œμ•„μ•Ό ν•œλ‹€.
1) 뷰의 μ‹œμž‘μ  = CGPoint = x, y μ’Œν‘œ
2) 뷰의 크기 = CGSize = width, height 크기

 

πŸ€” 뷰의 μ’Œν‘œκ³„μ—μ„œ ν”„λ ˆμž„κ³Ό λ°”μš΄λ“œκ°€ 각각 μžˆλŠ” μ΄μœ λŠ” λ­˜κΉŒμš”? μ–΄λŠ μƒν™©μ—μ„œ ν”„λ ˆμž„μ„ μ“°κ³ , λ°”μš΄λ“œλ₯Ό μ“°λ©΄ 쒋을지 μƒκ°ν•΄λ΄…μ‹œλ‹€.

 

Frame 을 μ΄μš©ν•  경우

 

 

  • Super View κΈ°μ€€μœΌλ‘œ λ·°λ₯Ό λ°°μΉ˜ν•΄μ•Ό ν•  경우. μ¦‰, UIView 의 μœ„μΉ˜λ‚˜ 크기λ₯Ό μ„€μ •ν•˜λŠ” 경우
  • μ‹€μ œλ‘œ Storyboard μ—μ„œλ„ View μœ„μΉ˜ 지정 μ‹œ frame 값을 μ΄μš©ν•œλ‹€.

 

Bounds λ₯Ό μ΄μš©ν•  경우

 

  • View 내뢀에 그림을 κ·Έλ €μ•Ό ν•  경우
  • View λ₯Ό νšŒμ „ν•œ κ²½μš°μ— View 의 크기λ₯Ό μ•Œκ³  싢을 λ•Œ (View λ‚΄λΆ€ μ’Œν‘œμ΄λ―€λ‘œ 값이 λ³€ν•˜μ§€ μ•ŠλŠ”λ‹€)
  • ν•΄λ‹Ή View 의 SubView 듀을 μ •λ ¬ν•˜λŠ” λ“± λ‚΄λΆ€μ˜ λ·°λ“€μ˜ μœ„μΉ˜λ₯Ό λ³€κ²½ν•  경우

 


πŸ’‘ View Hierarchy Debug Tool

View Hierarchy Debug Tool 은 λ·°κ°€ μ–΄λ–»κ²Œ κ΅¬μ„±λ˜μ–΄ μžˆλŠ”μ§€, μ–΄λ–»κ²Œ μŒ“μ—¬μžˆλŠ”μ§€ 확인할 수 μžˆλŠ” νˆ΄μ΄λ‹€. μ‚¬μ΄μ¦ˆ μΈμŠ€νŽ™ν„°λ‘œ 확인해보면, Autolayout 으둜 μ„€μ •ν•œ μ œμ•½μ΄ μ–΄λ–€κ²Œ μžˆλŠ”μ§€, Frame/Bounds 값듀을 확인할 수 μžˆλ‹€.

* λ·°κ°€ λ³΅μž‘ν•˜κ²Œ κΌ¬μΈλ‹€κ±°λ‚˜, μ˜€ν† λ ˆμ΄μ•„μ›ƒμ΄ 잘λͺ» μ μš©λœλ‹€ μ‹Άμ„λ•Œ κΌ­ ν™•μΈν•˜κΈ°

* λ·° κ³„μΈ΅μ˜ 맨 ν•˜λ‹¨(μ™Όμͺ½)을 보면 UIWindow κ°€ κΉ”λ €μžˆλ‹€.


μ•„λž˜μ˜ μ§ˆλ¬Έλ“€μ— λͺ…ν™•νžˆ λŒ€λ‹΅ν•  수 μžˆλ„λ‘ ν•˜κΈ°!

  • Bounds 와 Frame 의 차이점을 μ„€λͺ…ν•˜μ‹œμ˜€.
  • View 객체에 λŒ€ν•΄ μ„€λͺ…ν•˜μ‹œμ˜€.
  • UIView μ—μ„œ Layer κ°μ²΄λŠ” 무엇이고 μ–΄λ–€ 역할을 λ‹΄λ‹Ήν•˜λŠ”μ§€ μ„€λͺ…ν•˜μ‹œμ˜€.
  • UIWindow 객체의 역할은 무엇인가?

참고 링크

 

 

728x90
728x90