🍎 iOS

[UIKit] UIView(3)

hyebin (Helia) 2022. 3. 30. 16:54
λ°˜μ‘ν˜•

μ„œλΈŒ ν΄λž˜μ‹± λ…ΈνŠΈ

UIView ν΄λž˜μŠ€λŠ” μ‹œκ°μ  μ½˜ν…μΈ μ™€ λ”λΆˆμ–΄ μœ μ € μƒν˜Έμž‘μš© μ œκ³΅μ„ μœ„ν•œ μ€‘μš”ν•œ μ„œλΈŒ ν΄λž˜μ‹± μ§€μ μž…λ‹ˆλ‹€.

viewλ₯Ό μƒμ†λ°›λŠ” 것은 viewλ₯Ό κ΅¬ν˜„ν•˜κ³  μ„±λŠ₯을 μ‘°μ •ν•˜κΈ° μœ„ν•΄ 더 λ§Žμ€ μž‘μ—…λ“€μ΄ ν•„μš”ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ UIViewν΄λž˜μŠ€κ°€ μ œκ³΅ν•˜μ§€ μ•ŠλŠ” 것이 μžˆμ„ λ•Œλ§Œ κ΅¬ν˜„ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. 

 

μ˜€λ²„λΌμ΄λ“œ ν•  ν•¨μˆ˜λ“€

UIViewλ₯Ό 상속받을 λ•Œ λ°˜λ“œμ‹œ μ˜€λ²„λΌμ΄λ“œ ν•΄μ•Ό ν•˜λŠ” μ†Œμˆ˜μ˜ λ©”μ„œλ“œλ“€μ΄ 있고, ν•„μš”μ— 따라 μ˜€λ²„λΌμ΄λ“œ ν•  수 μžˆλŠ” λ©”μ„œλ“œλ“€λ„ μžˆμŠ΅λ‹ˆλ‹€.

UIViewλŠ” μœ μ—°ν•˜κ²Œ μ„€μ • κ°€λŠ₯ν•œ 클래슀이기 λ•Œλ¬Έμ— μ»€μŠ€ν…€ λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ“œ ν•˜μ§€ μ•Šκ³  μ •κ΅ν•œ λ·° λ™μž‘μœΌλ‘œ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒμ€ UIView 클래슀λ₯Ό μƒμ†λ°›μœΌλ©΄ μ˜€λ²„λΌμ΄λ“œ ν•  수 μžˆλŠ” λ©”μ„œλ“œ λ“€μž…λ‹ˆλ‹€.

  • μ΄ˆκΈ°ν™”
    • init(frame:): 이 λ°©λ²•μœΌλ‘œ μ΄ˆκΈ°ν™”ν•˜λŠ” 것이 κ°€μž₯ μ’‹μŠ΅λ‹ˆλ‹€. λ˜ν•œ 이 λ©”μ„œλ“œλ₯Ό μ»€μŠ€ν…€ν•˜μ—¬ μ΄ˆκΈ°ν™” λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • init(coder:): μŠ€ν† λ¦¬ λ³΄λ“œ ν˜Ήμ€ Nib νŒŒμΌμ—μ„œ viewλ₯Ό λ‘œλ“œν•˜κ³  view에 μ»€μŠ€ν…€ μ΄ˆκΈ°ν™”κ°€ ν•„μš”ν•œ κ²½μš°μ— μ‚¬μš©ν•˜μ„Έμš”.
    • layerClass: view 뒀에 λ‹€λ₯Ό Core Animation layerλ₯Ό μ‚¬μš©ν•˜λ €λ©΄ 이 속성을 μ‚¬μš©ν•˜μ„Έμš”.
  • λ“œλ‘œμž‰κ³Ό ν”„λ¦°νŒ…
    • draw(_:): μ»€μŠ€ν…€ μ½˜ν…μΈ λ₯Ό 그릴 κ±°λ©΄ 이 λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ„Έμš”. μ»€μŠ€ν…€ μ½˜ν…μΈ λ₯Ό 그릴 것이 μ—†λ‹€λ©΄ 이 λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ“œ ν•˜μ§€ λ§ˆμ„Έμš”.
    • draw(_:for:): printing ν•˜λŠ” λ™μ•ˆ view의 μ½˜ν…μΈ λ₯Ό λ‹€λ₯΄κ²Œ κ·Έλ¦¬λ €λŠ” κ²½μš°μ—λ§Œ 이 λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜μ„Έμš”.
  • λ ˆμ΄μ•„μ›ƒκ³Ό μ œμ•½μ‘°κ±΄
    • requiresConstraintBasedLayout: view ν΄λž˜μŠ€κ°€ μ œλŒ€λ‘œ λ™μž‘ν•˜κΈ° μœ„ν•΄ μ œμ•½μ‘°κ±΄μ΄ ν•„μš”ν•œ 경우 μ‚¬μš©ν•˜μ„Έμš”.
    • updateConstraints(): 뷰와 ν•˜μœ„ λ·° 간에 μ»€μŠ€ν…€ μ œμ•½μ‘°κ±΄ 생성이 ν•„μš”ν•œ 경우 이 λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜μ„Έμš”.
    • alignmentRect(forFrame:), frame(forAlignmentRect:): μ—¬λŸ¬ λ·° κ°„μ˜ μ •λ ¬λ˜λŠ” 방법을 μ˜€λ²„λΌμ΄λ“œ ν•˜λ €λ©΄ 이 λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜μ„Έμš”.
    • didAddSubview(_:), willRemoveSubview(_:): ν•˜μœ„ λ·°λ₯Ό 생성과 제거λ₯Ό μΆ”μ ν•˜κ³  μ‹Άλ‹€λ©΄ μ΄λŸ¬ν•œ λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜μ„Έμš”.
    • willMove(toSuperview:), didMoveToSuperview(): λ·° κ³„μΈ΅μ—μ„œ ν˜„μž¬ 뷰의 이동을 μΆ”μ ν•˜κ³  μ‹Άλ‹€λ©΄ μ΄λŸ¬ν•œ λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜μ„Έμš”.
  • 이벀트 핸듀링
    • gestureRecognizerShouldBegin(_:) : λ·°κ°€ ν„°μΉ˜ 이벀트λ₯Ό 직접 μ²˜λ¦¬ν•˜κ³  μ—°κ²°λœ 제슀처 인식기가 μΆ”κ°€ μž‘μ—…μ„ νŠΈλ¦¬κ±°ν•˜μ§€ λͺ»ν•˜λ„둝 ν•˜λ €λ©΄ 이 λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜μ„Έμš”.
    • touchesBegan(_:with:), touchesMoved(_:with:), touchesEnded(_:with:), touchesCancelled(_:with:): ν„°μΉ˜ 이벀트λ₯Ό 직접 μ²˜λ¦¬ν•˜κ³  μ‹Άλ‹€λ©΄ 이 λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜μ„Έμš”. (제슀처 기반 μž…λ ₯일 경우 제슀처 인식기λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.)

 

μ„œλΈŒ ν΄λž˜μ‹±μ˜ λŒ€μ•ˆ

뷰의 μ—¬λŸ¬ λ™μž‘λ“€μ€ λ”°λ‘œ 상속할 ν•„μš” 없이도 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ©”μ„œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ“œ ν•˜κΈ° 전에 λ‹€μŒ λ‚˜μ—΄λ˜λŠ” μ†μ„±μ΄λ‚˜ λ™μž‘λ“€μ„ μˆ˜μ •ν•˜λ©΄ ν•„μš”ν•œ λ™μž‘μ„ μ œκ³΅ν•  수 μžˆλŠ”μ§€ κ³ λ €ν•΄λ³΄μ„Έμš”.

  • addConstraint(_:): 뷰와 ν•˜μœ„ 뷰에 λŒ€ν•œ μ˜€ν†  λ ˆμ΄μ•„μ›ƒμ„ μ •μ˜ν•©λ‹ˆλ‹€.
  • autoresizingMask: super 뷰의 frame이 λ°”λ€Œλ©΄ μ˜€ν†  λ ˆμ΄μ•„μ›ƒ λ™μž‘μ„ μ œκ³΅ν•©λ‹ˆλ‹€. 이 λ™μž‘μ€ μ œμ•½μ‚¬ν•­λ“€κ³Ό 결합될 수 μžˆμŠ΅λ‹ˆλ‹€.
  • contentMode: λ·° frame이 μ•„λ‹Œ 뷰의 μ½˜ν…μΈ μ— λŒ€ν•œ λ ˆμ΄μ•„μ›ƒ λ™μž‘μ„ μ œκ³΅ν•©λ‹ˆλ‹€. λ˜ν•œ 이 속성은 뷰에 맞게 μ½˜ν…μΈ λ₯Ό μ‘°μ •ν•˜λŠ” 방법을 μ œκ³΅ν•˜κ³  μ½˜ν…μΈ λ₯Ό μƒˆλ‘œ 그릴지 μΊμ‹œ ν• μ§€ κ²°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • isHidden or alpha:  λ·° μ „μ²΄μ˜ 투λͺ…도λ₯Ό λ³€κ²½ν•©λ‹ˆλ‹€.
  • backgroundColor: ν•΄λ‹Ή 색상을 직접 κ·Έλ¦¬λŠ” 것 λŒ€μ‹ μ— 뷰의 색상을 μ„€μ •ν•©λ‹ˆλ‹€.
  • Subviews: draw(_:) λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ½˜ν…μΈ λ₯Ό κ·Έλ¦¬λŠ” λŒ€μ‹  μ›ν•˜λŠ” μ½˜ν…μΈ λ₯Ό ν¬ν•¨ν•œ imageλ‚˜ label의 ν•˜μœ„ λ·°λ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€.
  • Gesture Recognizer:  ν„°μΉ˜ 이벀트λ₯Ό 직접 μ²˜λ¦¬ν•˜λŠ” ν•˜μœ„ 클래슀 λŒ€μ‹  제슀처 인식기λ₯Ό μ‚¬μš©ν•˜μ—¬ λŒ€μƒ 객체에 Target-Action을 보낼 수 μžˆμŠ΅λ‹ˆλ‹€.
  • Animations:  λ³€κ²½ 사항을 직접 μ• λ‹ˆλ©”μ΄μ…˜μœΌλ‘œ λ§Œλ“€μ§€ 말고 λ‚΄μž₯된 μ• λ‹ˆλ©”μ΄μ…˜ 지원 κΈ°λŠ₯을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Core Animationμ—μ„œ μ œκ³΅ν•˜λŠ” μ• λ‹ˆλ©”μ΄μ…˜ supportλŠ” λΉ λ₯΄κ³  μ‚¬μš©ν•˜κΈ° μ‰½μŠ΅λ‹ˆλ‹€.
  • Image-based backgrounds: 정적인 μ½˜ν…μΈ λ₯Ό ν‘œμ‹œν•˜λŠ” view의 경우 이미지λ₯Ό 직접 μ„œλΈŒ ν΄λž˜μ‹± ν•˜κ³  κ·Έλ¦¬λŠ” λŒ€μ‹  제슀처 인식기와 ν•¨κ»˜ UIImageView객체λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. λŒ€μ•ˆμœΌλ‘œ UIView객체λ₯Ό μ‚¬μš©ν•˜κ³  이미지λ₯Ό view의 CALayer객체의 μ½˜ν…μΈ λ‘œ ν• λ‹Ήν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

μ• λ‹ˆλ©”μ΄μ…˜μ€ λ³΅μž‘ν•œ λ“œλ‘œμž‰ μ½”λ“œμ˜ μ„œλΈŒ ν΄λž˜μ‹±κ³Ό κ΅¬ν˜„ 없이 μ‹œκ°μ  λ³€ν™”λ₯Ό 쀄 수 μžˆλŠ” 또 λ‹€λ₯Έ λ°©λ²•μž…λ‹ˆλ‹€.

UIView 클래슀의 λ§Žμ€ 속성듀이 μ• λ‹ˆλ©”μ΄μ…˜ κ°€λŠ₯ν•˜λ©° μ΄λŸ¬ν•œ μ†μ„±μ˜ λ³€κ²½μœΌλ‘œ μ‹œμŠ€ν…œμ—μ„œ μƒμ„±λœ μ• λ‹ˆλ©”μ΄μ…˜μ΄ 트리거 될 수 μžˆμŠ΅λ‹ˆλ‹€.

μ• λ‹ˆλ©”μ΄μ…˜μ„ μ‹œμž‘ν•˜λ €λ©΄ λ’€λ”°λ₯΄λŠ” 변경사항을 μ• λ‹ˆλ©”μ΄μ…˜μœΌλ‘œ ν‘œν˜„ν•΄μ•Ό ν•œλ‹€λŠ” μ½”λ“œ ν•œ μ€„λ§Œ 있으면 λ©λ‹ˆλ‹€.

 

 

 

 

 

 

λ°˜μ‘ν˜•