배경
변경 전 MainView는 TabView(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로 구성
- 별도 사이드바를
VStack과 Button으로 구성
- 사이드바에서
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 작업에서 유지
완료 조건
검증
제외 범위
NavigationSplitView 도입
.sidebarAdaptable 전환 기능 유지 또는 사용자 정의
- 탭별 Store와 navigation path의 상위 이동
- Home, Today, Notification, Profile 본문 UI 변경
TodoPropertiesView와 inspector toolbar 재구성
- iOS 27.1 SDK 도입과
ReservedRegion 구현
- #879의 일반 View 분리 작업
관련 자료
배경
변경 전
MainView는TabView(selection:)에.sidebarAdaptable을 적용했다. iPadOS에서 사이드바를 표시한 뒤에도 탭 바로 돌아갈 수 있어 시스템이 상단 전환 영역을 계속 확보하고, 화면별 타이틀과 본문 시작 위치가 달라지는 문제가 확인됐다.Home, Today, Notification, Profile은 서로 동등한 최상위 목적지다. 좁은 화면에서는 시스템
TabView를 유지하고, 넓은 화면에서는 별도 사이드바를 제공하되 탭별 Store와 navigation path의 현재 소유 구조를 보존해야 한다.기술적 선택은 메인 탐색은 별도 사이드바와 단일 TabView로 구성에 기록함.
구현 순서
.sidebarAdaptable보존 조건을 본 이슈의 최종 구조 기준으로 정정 완료담당 범위
EntryApplication/Presentation/Entry/Sources/Main/MainView.swiftSideBar와 사이드바 너비 조절 modifier작업 범위
MainView에서.tabViewStyle(.sidebarAdaptable)제거TabView(selection:)를 같은 구조적 위치에 유지private struct SideBar로 구성VStack과Button으로 구성List,ScrollView,LazyVStack,Label,accessibilityLabel사용 금지TabView가 기존selectedTabBinding 공유MainTab의 기존 제목과 symbol을 사이드바에서도 사용GeometryProxy.containerCornerInsets.topLeading.height를 상단 padding으로 사용해 창 제어 영역 회피기존 동작 보존
TodoEditorWindowEvent전달isTabContentActive를 이용한 비활성 탭 상태 처리.inspector표시와 상세 이동iPhone Duo 조건
TabView를 유지selectedTab, 탭별 Store와 navigation path 유지ReservedRegion을 이용한 접힘 영역 대응과 세로 bar 동작을 별도로 검증완료 조건
.sidebarAdaptable과 시스템의 사이드바·탭 바 전환 버튼이 제거됨TabView(selection:)가 화면 너비와 관계없이 같은 구조적 위치에 유지됨selectedTab값으로 동기화됨.id, 새 Coordinator 또는 Store 보관 객체가 추가되지 않음검증
git diff --checkDevLog.xcworkspace의Appscheme build-only제외 범위
NavigationSplitView도입.sidebarAdaptable전환 기능 유지 또는 사용자 정의TodoPropertiesView와 inspector toolbar 재구성ReservedRegion구현관련 자료