iOS

iOS) UISheetPresentationController dimming view alpha μˆ˜μ •ν•΄λ³΄κΈ°(μ‹€νŒ¨)

hyun99999 2023. 10. 10. 17:39
728x90
λ°˜μ‘ν˜•

πŸ‘‰ λ‚΄μš©

  • dimming view 의 alpha 값을 μˆ˜μ •ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.
  • 결과적으둜 alpha 값을 μ›ν•˜λŠ”λŒ€λ‘œ μˆ˜μ •ν•˜μ§€ λͺ»ν–ˆκ³ , λ·° κ³„μΈ΅μ˜ 접근방법과 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ κ³ λ―Όν•œ 과정을 κΈ€λ‘œμ¨ μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

πŸ‘‰ dimming view alpha μˆ˜μ •

μš°μ„ , 개발자 λ¬Έμ„œμ—μ„œλŠ” alpha 에 λŒ€ν•œ μ•ˆλ‚΄κ°€ μ—†κΈ° λ•Œλ¬Έμ— view 에 μ ‘κ·Όν•΄μ„œ ν”„λ‘œνΌν‹°λ₯Ό μˆ˜μ •ν•΄λ³΄κΈ° μœ„ν•΄ view hierarchy λ₯Ό ν™•μΈν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

11

view hierarchy λ₯Ό 확인해보면 background alpha 기본값은 0.2 둜 μ„€μ •λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό μˆ˜μ •ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

UIDimmingView 에 μ ‘κ·Όν•˜κΈ° μœ„ν•΄μ„œ

UIWindowScene > UIWindow > UITransitionView > UIDimmingView 인 것을 μ•Œμ•„μ•Ό ν•©λ‹ˆλ‹€.

λ‹€μŒμ˜ μ½”λ“œλ‘œ μ ‘κ·Όν•΄μ„œ 속성을 ν™•μΈν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

// βœ… UIWindowScene > UIWindow > UITransitionView > UIDimmingView
let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene
let windows = windowScene?.windows.first?.subviews

print(windows)
// Optional([<UITransitionView: 0x117f1b160; frame = (0 0; 393 852); autoresize = W+H; layer = <CALayer: 0x600000278560>>, <UITransitionView: 0x117f33140; frame = (0 0; 393 852); autoresize = W+H; layer = <CALayer: 0x6000002d2d40>>, <UITransitionView: 0x11748eed0; frame = (0 0; 393 852); autoresize = W+H; layer = <CALayer: 0x600000334b00>>])

view hierachy 에 ν‘œμ‹œλœ λŒ€λ‘œ μ„Έ 개의 UITransitionView 쀑 λ§ˆμ§€λ§‰μ˜ UIDimmingView 에 μ ‘κ·Όν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

12
// βœ… UIWindowScene > UIWindow > UITransitionView > UIDimmingView
let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene
let transitionView = windowScene?.windows.first?.subviews[2]
let dimmingView = transitionView?.subviews[0]

dimmingView?.alpha = 0.8

print(transitionView?.subviews)
// Optional([<UIDimmingView: 0x11ad97b60; frame = (-393 -852; 1179 2556); alpha = 0.8; opaque = NO; gestureRecognizers = <NSArray: 0x600000ecf840>; backgroundColor = UIExtendedSRGBColorSpace 0 0 0 0.2; layer = <CALayer: 0x60000031b8a0>>, <UIDropShadowView: 0x11ada0260; frame = (0 548; 393 304); gestureRecognizers = <NSArray: 0x600000e8c270>; layer = <CALayer: 0x600000336200>>])

UIDimmingView 에 μ ‘κ·Όν•  수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€!

λ‹€μŒκ³Ό 같이 view 자체λ₯Ό 0.8 둜 μ„€μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ background 의 alpha 값이 0.2이기 λ•Œλ¬Έμ— μ˜λ„ν•œ UI κ°€ μ•„λ‹ˆμ§€λ§Œ μˆ˜μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€!

13

μ΄λ²ˆμ—λŠ” background 색상에 검정색에 alpha 값을 0.4 μ£Όμ–΄μ„œ μˆ˜μ •ν•˜μ—¬ μ˜λ„ν•œ UI κ°€ μ™„μ„±λ˜λ„λ‘ ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene
let transitionView = windowScene?.windows.first?.subviews[2]
let dimmingView = transitionView?.subviews[0]
dimmingView?.backgroundColor = .black.withAlphaComponent(0.4)
14

ν•˜μ§€λ§Œ, μ΄λŸ°μ‹μ˜ 접근을 μœ„ν•΄μ„œλŠ” viewDidLoad μ—μ„œ ν˜ΈμΆœν•  수 μ—†μŠ΅λ‹ˆλ‹€. ν•΄λ‹Ή 라이프 μ‚¬μ΄ν΄κΉŒμ§€λŠ” λ‹Ήμ—°νžˆ λ·°κ°€ 아직 그렀지기 μ „μ΄λ‹ˆ UITransitionView κ°€ 두 개만 μžˆμŠ΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ viewWillAppear 단계 이후뢀터 μš°λ¦¬κ°€ λ‹€λ£¨κ³ μžν•˜λŠ” UITransitionView 에 μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν•΄λ‹Ή 라이프 μ‚¬μ΄ν΄μ—μ„œ alpha 값을 μ‘°μ •ν•˜κ²Œ 되면 λ‹€μŒκ³Ό 같이 λΆ€μžμ—°μŠ€λŸ½κ²Œ UI κ°€ λ³€ν•  수 밖에 μ—†μ—ˆμŠ΅λ‹ˆλ‹€.

🚨 νŠΈλŸ¬λΈ” μŠˆνŒ…

아직 λ§Œλ“€μ–΄μ§€μ§€ μ•Šμ€ λ·°κ°€ μ΄λ ‡κ²Œ λ·° 계측을 κ°€μ§ˆ 것이닀 λΌλŠ” μ „μ œλ₯Ό 가지고 뷰에 μ ‘κ·Όν•΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.

κ·Έ κ²°κ³Ό νŠΉμ • 라이프 사이클 이후에 뷰에 μ ‘κ·Όν•  수 μžˆμ—ˆκ³ , λΆ€μžμ—°μŠ€λŸ½κ²Œ UI κ°€ κ·Έλ €μ§€λŠ” 것에 μ΄λŠ” μ‚¬μš©ν•  수 μ—†λ‹€κ³  νŒλ‹¨ν–ˆμŠ΅λ‹ˆλ‹€. 😭

πŸ‘‰ μ ‘κ·Ό

UITransitionView λ₯Ό λ³΄λ‹ˆ present() λ©”μ†Œλ“œλ₯Ό ν†΅ν•΄μ„œ λ·°λ₯Ό 보여쀄 λ•Œ UISheetPresentationController μ„€μ • 없이도 μ•„λž˜μ™€ 같이 λ‹€μŒ 화면을 띄어쀄 λ•Œλ„ dimming view κ°€ 있던 것이 μƒκ°λ‚¬μŠ΅λ‹ˆλ‹€.

nextViewController.modalPresentationStyle = .pageSheet

μ—­μ‹œλ‚˜ λ™μΌν•œ UIDimmingView μ˜€μŠ΅λ‹ˆλ‹€.

16

문제의 관점을 λ°”κΎΈμ–΄μ„œ modalPresentationStyle.pageSheet 일 λ•Œ dimming view 의 alpha 값을 λ³€κ²½ν•΄μ•Όν•˜λŠ” λ¬Έμ œμž„μ„ μ•Œκ²Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

μ΄λŠ” 더이상 UISheetPresentationController 와 κ΄€λ ¨λœ λ¬Έμ œκ°€ μ•„λ‹Œ UIPresentationController 클래슀λ₯Ό 상속받아 presentationController 을 μ»€μŠ€ν…€ν•΄μ•Όν•˜λŠ” λ¬Έμ œμž„μ„ μ•Œκ²Œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

728x90
λ°˜μ‘ν˜•