EEYatHo 앱 깎는 이야기

Swift ) StackView backgroundColor - EEYatHo iOS 본문

iOS, Swift

Swift ) StackView backgroundColor - EEYatHo iOS

EEYatHo 2021. 11. 3. 12:20
반응형

요약

 

iOS14 미만은 UIStackView의 layer이 CATransformLayer이라 backgroundColor 속성을 무시한다.

iOS14 이상부터는 UIStackView의 layer이 CALayer로 바뀌면서 backgroundColor 속성을 사용할 수 있다.

따라서 버전분기 코드로 대응하면 된다.

 


iOS 12에서 stackView의 backgroundColor가 이상한 이슈가 발견되었다.

 

아래 코드를 실행해도, backgroundColor를 찍어보면, nil이 나온다/?

stackView.backgroundColor = .blue
(lldb) po stackView.backgroundColor
"nil"

 


iOS12에서는 UIStackView의 layer은 CATransformLayer 이다.

(lldb) po stackView
<UIStackView: 0x7fdc0270b3c0; frame = (0 0; 0 0);
layer = <CATransformLayer: 0x600002de3e40>>

하지만 iOS14부터는 layer가 CALayer 클래스로 변경되었다.

(lldb) po stackView
<UIStackView: 0x7fa253f0bdc0; frame = (0 0; 0 0);
layer = <CALayer: 0x600003339440>>

출처 : https://useyourloaf.com/blog/stack-view-background-color-in-ios-14/

 

 


 

아래에 적힌 것 처럼, CATransformLayerCALayer과 다르게, backgroundColor를 포함한 여러 속성을 무시한다.

 

  • Only the sublayers of a transform layer are rendered. The CALayer properties that are rendered by a layer are ignored, including: backgroundColor, contents, border style properties, stroke style properties, etc.

출처 : https://developer.apple.com/documentation/quartzcore/catransformlayer

 

 

즉, iOS14부터는 UIStackView의 layer이 CALayer로 바뀌었으므로, backgroundColor가 적용된다.

 


아래의 버전 분기 코드로 대응할 수 있다.

if #available(iOS 14.0, *) {
    stackView.backgroundColor = .black
} else {
    let backgroundView = UIView()
    backgroundView.backgroundColor = .black
    stackView.addSubview(backgroundView)
    
    backgroundView.snp.makeConstraints {
        $0.edges.equalToSuperview()
    }
    stackView.sendSubviewToBack(backgroundView)
}

 

 

Comments