Skip to content

커스텀 탭바 구현 및 네비게이션 구조 개선#30

Merged
kangddong merged 4 commits into
developfrom
feature/29-custom-tabbar
Feb 25, 2026
Merged

커스텀 탭바 구현 및 네비게이션 구조 개선#30
kangddong merged 4 commits into
developfrom
feature/29-custom-tabbar

Conversation

@kangddong

@kangddong kangddong commented Feb 25, 2026

Copy link
Copy Markdown
Collaborator

About this PR

⚓ Related Issue


🥥 Contents

이 PR은 CustomTabBar 구현과 네비게이션 구조 개선을 포함합니다.

1. History 네비게이션 구조 개선

  • Tree-based → Stack-based 전환
    • 기존: @Presents 기반 Tree navigation
    • 변경: StackState/StackAction 기반 Stack navigation
    • 이유: iOS 표준 swipe-back 제스처 지원
    • 결과: 자연스러운 뒤로가기 동작 및 네비게이션 스택 관리

2. CustomTabBar UI 컴포넌트 구현

  • 시스템 TabView 대신 커스텀 TabBar 구현
  • 선택 상태에 따른 아이콘 및 텍스트 스타일 변경
  • 탭바 아이콘 리소스 추가 (캘린더, 내역, 마이페이지)
  • shadow 및 spacing 디자인 적용

3. TabBar visibility 관리 책임 분리

  • Before: 각 Feature에서 화면 전환마다 상위 리듀서에 delegate 전송

  • 과도한 전파로 인해 모든 화면 전환에 대한 유즈케이스에 대해 TabBar visibility 코드를 작성해야함

    // 각 Feature에서 반복적으로
    .send(.delegate(.showTabBar))
    .send(.delegate(.hideTabBar))
  • After: MainTabFeature가 child state를 관찰하여 자동 계산 (파생 상태)

    var isTabBarVisible: Bool {
      history.path.isEmpty &&
      calendar.addDori == nil &&
      myPage.navigationPath.isEmpty
    }
  • 역할 분리:

    • Feature: path/navigation 관리에만 집중
    • MainTabFeature: isTabBarVisible 계산 및 TabBar 표시 관리

4. MainTabView 레이아웃 개선

  • ZStack → VStack(spacing: 0) 구조
    • Content와 TabBar가 명시적으로 수직 배치
    • Content가 TabBar에 가려지지 않음
    • 각 화면에서 불필요한 bottom padding 제거

📸 Screenshot

커스텀 탭바 구현

Other information 🔥

기술적 개선

  1. 책임 과다 해소: Feature가 TabBar 상태를 신경 쓰지 않음
  2. 단방향 데이터 플로우 강화: 파생 상태(computed property)로 자동 계산
  3. 코드 중복 제거: 각 Feature에서 반복되던 delegate 제거
  4. 명확한 레이아웃: VStack 기반으로 예측 가능한 UI 구조

Lessons Learned 문서 추가

  • StackAction.popFrom 타이밍 이슈 문서화
  • .popFrom은 pop 시작 시점 호출 (완료 전)
  • path.count == 1로 root 복귀 감지

kangddong and others added 4 commits February 25, 2026 23:55
PartnerDoriHistory → PartnerDoriDetail 화면에서 swipe-back 제스처 시
DoriList로 건너뛰는 문제를 해결했습니다.

변경 사항:
- HistoryFeature에 Path reducer enum 추가 (partnerHistory, partnerDoriDetail, addDori, editDori)
- @presents 네비게이션을 StackState<Path>로 변경
- PartnerDoriHistoryFeature에서 @presents doriDetail 제거
- 모든 push 목적지를 단일 navigation path로 평탄화

이제 SwiftUI가 단일 navigation path로 관리하여 swipe-back이 정상 동작합니다.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
.popFrom은 pop 시작 시점에 호출되므로 isEmpty 대신 count == 1로
root 복귀를 감지해야 합니다.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- CustomTabBar 및 TabBarItem 컴포넌트 생성
- 탭바 아이콘 리소스 추가 (캘린더, 내역, 마이페이지)
- 선택 상태에 따른 아이콘 및 텍스트 스타일 변경
- shadow 및 spacing 디자인 적용

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
MainTabView를 VStack 기반 레이아웃으로 변경하고, TabBar visibility 관리 책임을 분리했습니다.

**변경 사항**:
- MainTabView: ZStack → VStack(spacing: 0) 구조로 변경
  - Content와 TabBar가 명시적으로 수직 배치
  - Content가 TabBar에 가려지지 않음

- TabBar visibility 관리 책임 분리:
  - Before: 각 Feature에서 화면 전환마다 상위 리듀서에 delegate 전송
  - After: MainTabFeature가 child state를 관찰하여 자동 계산 (파생 상태)

- 역할 분리:
  - Feature: path/navigation 관리에만 집중
  - MainTabFeature: isTabBarVisible 계산 및 TabBar 표시 관리

- 각 Feature에서 불필요한 delegate 액션 제거:
  - HistoryFeature: showTabBar/hideTabBar delegate 제거
  - CalendarFeature: 기존 로직 유지 (addDori 상태 기반)

- DoriListView: TabBar로 인한 중복 padding 제거

**기술적 개선**:
- 책임 과다 해소: Feature가 TabBar 상태를 신경 쓰지 않음
- 단방향 데이터 플로우 강화: 파생 상태로 자동 계산
- 코드 중복 제거: 각 Feature에서 반복되던 delegate 제거

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
@kangddong kangddong linked an issue Feb 25, 2026 that may be closed by this pull request
9 tasks
@kangddong kangddong self-assigned this Feb 25, 2026
@kangddong kangddong changed the title feat: CustomTabBar 구현 및 네비게이션 구조 개선 커스텀 탭바 구현 및 네비게이션 구조 개선 Feb 25, 2026
@kangddong kangddong added the 피처 개발 🔨 피처 개발 label Feb 25, 2026
@kangddong kangddong merged commit a902ffc into develop Feb 25, 2026
1 check passed
@kangddong kangddong deleted the feature/29-custom-tabbar branch February 25, 2026 16:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

피처 개발 🔨 피처 개발

Projects

None yet

Development

Successfully merging this pull request may close these issues.

커스텀 탭바

1 participant