Skip to content

메인 탐색을 별도 사이드바와 단일 TabView로 전환한다 #893

Description

@opficdev

배경

변경 전 MainViewTabView(selection:).sidebarAdaptable을 적용했다. iPadOS에서 사이드바를 표시한 뒤에도 탭 바로 돌아갈 수 있어 시스템이 상단 전환 영역을 계속 확보하고, 화면별 타이틀과 본문 시작 위치가 달라지는 문제가 확인됐다.

Home, Today, Notification, Profile은 서로 동등한 최상위 목적지다. 좁은 화면에서는 시스템 TabView를 유지하고, 넓은 화면에서는 별도 사이드바를 제공하되 탭별 Store와 navigation path의 현재 소유 구조를 보존해야 한다.

기술적 선택은 메인 탐색은 별도 사이드바와 단일 TabView로 구성에 기록함.

구현 순서

담당 범위

  • Entry
  • Application/Presentation/Entry/Sources/Main/MainView.swift
  • 같은 파일 내부의 전용 SideBar와 사이드바 너비 조절 modifier

작업 범위

  • MainView에서 .tabViewStyle(.sidebarAdaptable) 제거
  • 화면 너비와 관계없이 하나의 TabView(selection:)를 같은 구조적 위치에 유지
  • regular width에서 별도 사이드바를 표시하고 시스템 tab bar 숨김
  • compact width에서 별도 사이드바를 숨기고 시스템 tab bar 표시
  • Mac Designed for iPad에서는 size class와 관계없이 별도 사이드바 표시
  • 별도 사이드바를 같은 파일의 private struct SideBar로 구성
  • 별도 사이드바를 VStackButton으로 구성
  • 사이드바에서 List, ScrollView, LazyVStack, Label, accessibilityLabel 사용 금지
  • 사이드바 UI에 Liquid Glass 사용 금지
  • 사이드바와 TabView가 기존 selectedTab Binding 공유
  • MainTab의 기존 제목과 symbol을 사이드바에서도 사용
  • 알림 탭의 읽지 않은 알림 수를 시스템 tab bar와 별도 사이드바에 동일하게 반영
  • 프로필 탭을 사이드바 하단에 배치
  • 전용 modifier에서 사이드바 최소·기본·최대 너비를 받고 드래그로 범위 안에서 조절
  • 드래그 좌표를 전역 좌표계로 계산해 너비 조절 중 떨림 방지
  • 사이드바 구분선과 배경을 세로 safe area 끝까지 확장
  • iPadOS 26에서 GeometryProxy.containerCornerInsets.topLeading.height를 상단 padding으로 사용해 창 제어 영역 회피
  • 창 제어 영역 높이 하드코딩 금지

기존 동작 보존

  • Home, Today, Notification, Profile의 현재 Store 소유 위치
  • Home, Today, Profile의 탭별 navigation path
  • 탭 전환에 따른 데이터 갱신과 분석 이벤트
  • 딥 링크와 TodoEditorWindowEvent 전달
  • isTabContentActive를 이용한 비활성 탭 상태 처리
  • Toast와 alert 표시
  • Today의 .inspector 표시와 상세 이동

iPhone Duo 조건

  • 닫힌 외부 화면처럼 compact width인 환경에서는 별도 사이드바를 숨기고 시스템 TabView를 유지
  • 시스템 tab bar가 세로로 배치되는 환경에서는 위치를 직접 고정하지 않고 시스템 배치 사용
  • 열린 내부 화면처럼 regular width인 환경에서는 별도 사이드바와 선택된 탭 콘텐츠를 함께 표시
  • 기기를 열거나 닫고 일부 접는 동안 selectedTab, 탭별 Store와 navigation path 유지
  • 별도 사이드바와 주요 조작 요소가 접힘 영역을 가로지르지 않도록 safe area와 사용할 수 있는 영역 반영
  • iOS 27.1 SDK 도입 후 ReservedRegion을 이용한 접힘 영역 대응과 세로 bar 동작을 별도로 검증
  • iPhone Duo의 세로 bar에서는 inspector가 별도 bar를 제공받지 않는다는 제약을 후속 inspector toolbar 작업에서 유지

완료 조건

  • .sidebarAdaptable과 시스템의 사이드바·탭 바 전환 버튼이 제거됨
  • 하나의 TabView(selection:)가 화면 너비와 관계없이 같은 구조적 위치에 유지됨
  • 넓은 화면에서 별도 사이드바가 표시되고 시스템 tab bar가 숨겨짐
  • 좁은 화면에서 별도 사이드바가 숨겨지고 시스템 tab bar가 표시됨
  • Mac Designed for iPad에서 항상 별도 사이드바가 표시됨
  • 사이드바 선택과 시스템 tab bar 선택이 하나의 selectedTab 값으로 동기화됨
  • 알림 badge가 두 탐색 표현에서 같은 읽지 않은 알림 수를 표시함
  • 사이드바 구현에 금지한 컨테이너와 API가 사용되지 않음
  • 사이드바가 지정 범위에서 떨림 없이 드래그로 조절됨
  • 사이드바 배경과 구분선이 세로 safe area 끝까지 이어짐
  • iPadOS 26 창 모드에서 창 제어 영역과 사이드바 항목이 겹치지 않음
  • 너비가 바뀌어도 탭별 Store와 navigation path가 초기화되지 않음
  • 컨테이너 전환용 .id, 새 Coordinator 또는 Store 보관 객체가 추가되지 않음
  • 넓은 화면에서 기존 시스템 탭 전환을 위한 불필요한 상단 영역이 남지 않음
  • 탭별 Presentation 모듈의 공개 계약과 탐색 구조가 변경되지 않음

검증

  • 변경 Swift 파일에 SwiftLint 실행
  • git diff --check
  • DevLog.xcworkspaceApp scheme build-only
  • 별도 실행 허용 후 다음 항목 확인
    • iPhone의 좁은 화면에서 시스템 tab bar와 네 목적지 접근
    • iPadOS 26 전체 화면과 창 모드의 별도 사이드바 및 상단 여백
    • Mac Designed for iPad의 별도 사이드바
    • 화면 회전과 창 너비 변경 전후의 선택 탭 및 navigation path 보존
    • 두 탐색 표현의 알림 badge 갱신
    • 사이드바 최소·최대 너비와 드래그 동작
  • Xcode 27.1 도입 후 iPhone Duo 외부·내부·일부 접힘 상태와 세로 bar 검증

제외 범위

  • NavigationSplitView 도입
  • .sidebarAdaptable 전환 기능 유지 또는 사용자 정의
  • 탭별 Store와 navigation path의 상위 이동
  • Home, Today, Notification, Profile 본문 UI 변경
  • TodoPropertiesView와 inspector toolbar 재구성
  • iOS 27.1 SDK 도입과 ReservedRegion 구현
  • #879의 일반 View 분리 작업

관련 자료

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions