TheClimeet / climeet-iOS

0 stars 0 forks source link

Feature/#1 배너 기능 구현 #6

Closed ericKwon95 closed 6 days ago

ericKwon95 commented 1 week ago

close #1

📓 Overview

🤔 고민 내용

Swift Testing 사용 시 이슈

실제 네트워킹 없이 테스트하기

// BannerReducerTests.swift @MainActor class BannerReducerTest: XCTestCase {

func testbannerRequest() async throws {
    let store = TestStore(initialState: BannerReducer.State()) {
        BannerReducer()
    }

    await store.send(.onFirstAppear)

    await store.receive(\.bannerResponse) {
        $0.bannerInfos = try [
            BannerDTO.ResponseElement(
                id: 1,
                bannerImageURL: "https://climeet-production-bucket.s3.ap-northeast-2.amazonaws.com/1615cdad-d781-4bf6-a4de-57a136eb0089.jpg",
                bannerTargetURL: "https://www.naver.com/",
                title: "배너테스트1",
                bannerStartDate: "2024-10-03",
                bannerEndDate: "2024-10-31",
                isPopup: false
            ),
            BannerDTO.ResponseElement(
                id: 2,
                bannerImageURL: "https://climeet-production-bucket.s3.ap-northeast-2.amazonaws.com/1615cdad-d781-4bf6-a4de-57a136eb0089.jpg",
                bannerTargetURL: "https://www.naver.com/",
                title: "배너테스트2",
                bannerStartDate: "2024-10-03",
                bannerEndDate: "2024-10-31",
                isPopup: false
            )
        ].map {
            try BannerInfo(from: $0)
        }
    }
}

}



### 무한 스크롤 배너 구현법 고민
- 지금은 무한 스크롤이 되지 않는 평범한 배너 입니다.
- Carousel 뷰 처럼, 양방향 무한 스크롤이 되는 것이 자연스러운 배너 동작으로 생각되어 양방향 무한 스크롤 배너를 구현하고자 합니다.
- prev, current, next 세 개의 뷰를 가지는 탭 뷰를 띄우고, 현재 선택한 배너 인덱스에 따라 뷰 내용을 바꿔치기하는 구조를 고민하고 있습니다. [참고](https://stackoverflow.com/questions/65457609/bidirectional-infinite-pageview-in-swiftui)
- 그러나 만족할 만큼 깔끔한 결과가 나오지 않아서... 혹시 관련해 구현해 보신 경험이 있다면 어떤 방법을 사용하셨는지 궁금합니다~

## 📸 Screenshot
| 5초마다 배너 이동 | 손으로 직접 이동 |
| -- | -- |
|<img src="https://github.com/user-attachments/assets/443cbc59-8c25-4514-9c80-09e1229a07d7" width=200>|<img src="https://github.com/user-attachments/assets/63283722-ef0d-421b-9e49-1fe82dcd5c75" width=200>|
iOS-Woong commented 1 week ago

무한 스크롤 배너 구현법 고민

구현하는방법은 많지만 저는 아래와 같이 할 것 같아요

  1. 실제 데이터 [ A, B, C] 라면 [ C(가장뒤꺼), A, B, C, A(가장앞꺼) ]로 변환해서 데이터로 활용
  2. 최초에는 데이터 A가 초기값으로 표시되도록 설정
  3. 스크롤할 경우 위치 재조정
    • 인덱스 1(A)에서 인덱스 0(C)으로 스크롤되었을 때, 애니메이션 없이 C로 오프셋 위치를 옮김
    • 인덱스 3(C)에서 인덱스 4(A)으로 스크롤되었을 때, 애니메이션 없이 A로 오프셋 위치를 옮김

일케 구현할 것 같아요 적어주신 아이디어에서 바꿔치기한다는 말을 인용하셨는데 그 말과 아마 동일한 맥락일 것 같네요!

몇개의 코멘트 이 외의 이번구현도 저는 너무 좋은 것 같습니다! 코드가 너무 깔끔해요 짱짱맨임니다

ericKwon95 commented 6 days ago

@iOS-Woong

웅님이 주신 아이디어로 제가 생각하는 완벽한 배너를 만들어보고 싶어 작업하고 있었는데요, 구현해보다가 쉽지 않은 부분이 있어서 일단 다른 리뷰만 적용해 머지하도록 하겠습니다!