iOS/SwiftUI

[ThirdParty] SwiftUI-Shimmer 해석하기

Hamp 2025. 7. 27. 15:32
반응형

👋 들어가기 전

로딩을 위해, 인디케이터를 돌릴 수도 있지만, 보여질 컨텐츠의 형태를 많이 보여주는

Shimmer Effect가 최근에 많이 보이는 것 같다.

 

이번에는 SwiftUI에서 SwiftUI-Shimmer 라이브러리를 해석해보고, 

 

사용되는 개념 중, 모르는 것들을 따로 정리해보자.


🏁 학습할 내용

      • 생소한 개념들
        • @Environment(\.layoutDirection)
        • BlendMode
        • RedactionReasons
      • 프로퍼티 분석

❓ 생소한 개념

@Environment(\.layoutDirection)

컨텐츠가 그려질 방향 (LTR, RTL) 

 

자세한 링크: https://hamp.tistory.com/244

 

BlendMode

두 뷰가 겹칠 때 어떻게 처리될 것인가??

 

자세한 링크: https://hamp.tistory.com/245

RedactionReasons

데이터를 가리는 이유를 열려줘

 

자세한 링크: https://hamp.tistory.com/246


📌 프로퍼티 분석

    public enum Mode { /// Gradient를 어떻게 활용할지 
        case mask /// 컨텐츠 마스킹
        case overlay(blendMode: BlendMode = .sourceAtop) /// 겹치기 
        case background /// 뒤에 배치
    } 

    private let animation: Animation // 적용할 애니메이션 
    private let gradient: Gradient // 적용할 Gradient 
    private let min, max: CGFloat // 영역의 최소 최대 범위
    private let mode: Mode // 위에 선어난 모드 
    @State private var isInitialState = true
    @Environment(\.layoutDirection) private var layoutDirection // 컨텐츠 표시 방햐아 (LTR or RTL)

    var startPoint: UnitPoint {
        if layoutDirection == .rightToLeft { // RTL
            isInitialState ? UnitPoint(x: max, y: min) : UnitPoint(x: 0, y: 1)
        } else { // LTR 
            isInitialState ? UnitPoint(x: min, y: min) : UnitPoint(x: 1, y: 1)
        }
    }

    /// The end unit point of our gradient, adjusting for layout direction.
    var endPoint: UnitPoint {
        if layoutDirection == .rightToLeft { // RTL
            isInitialState ? UnitPoint(x: 1, y: 0) : UnitPoint(x: min, y: max)
        } else { // LTR
            isInitialState ? UnitPoint(x: 0, y: 0) : UnitPoint(x: max, y: max)
        }
    }
    
        /*
     Calculating the gradient's animated start and end unit points:
     min,min
        \
         ┌───────┐         ┌───────┐
         │0,0    │ Animate │       │  "forward" gradient
     LTR │       │ ───────►│    1,1│  / // /
         └───────┘         └───────┘
                                    \
                                  max,max
                max,min
                  /
         ┌───────┐         ┌───────┐
         │    1,0│ Animate │       │  "backward" gradient
     RTL │       │ ───────►│0,1    │  \ \\ \
         └───────┘         └───────┘
                          /
                       min,max
     */

🏎️ startPoint와 endPoint

다른 부분은 이해가 됐지만 point 쪽을 조금 더 살펴보자.

LTR 기준으로 해석한다.

지금 보면 왼쪽위에서 -> 오른쪽아래로 검은색이 흘러간다.

그림으로 살펴보자.

먼저 startPoint와 endPoint는 이렇게 위치한다.

 

여기서 하얀 색 사각의 너비(높이)가 bandSize가 된다.

  • min = 0 - bandSize
  • max = 1 + bandSize

이후 이동 경로는 다음과 같다.

startPoint는 (min, min) 왼쪽 바깥에서, (1, 1) 오른쪽 아래 끝에 이동한다.

endPoint는 (0, 0) 왼쪽 위 끝에서, (max, max) 오른쪽 바깥으로 이동한다.


출처

https://github.com/markiv/SwiftUI-Shimmer

 

GitHub - markiv/SwiftUI-Shimmer: Shimmer is a super-light modifier that adds a shimmering effect to any SwiftUI View, for exampl

Shimmer is a super-light modifier that adds a shimmering effect to any SwiftUI View, for example, to show that an operation is in progress. It works well on light and dark modes, and across iOS, ma...

github.com

 

반응형