Skip to content

[Refactor] onTapGesture를 Button으로 전환해 접근성 트리 인식 개선 #248

Description

@Naknakk

Issue Title

탭 처리를 Text/이미지 + onTapGesture에서 Button으로 전환해 접근성 트리(VoiceOver·XcodeBuildMCP UI 자동화)에 버튼으로 잡히게 하고, .disabled()가 먹도록 개선한다.

Issue Content

배경

  • Text/이미지 + .onTapGesture는 접근성 트리에 static text로만 잡혀 .isButton trait/액션이 없다 → VoiceOver·XcodeBuildMCP snapshot_ui/elementRef 모두 탭 대상으로 인식이 어렵다.
  • 부수 효과로 .disabled()도 안 먹는다(CreateFeedView.swift 주석에 이미 기록됨). Button 전환으로 둘 다 해결.
  • 디자인시스템은 이미 Button 기반(WSSCTAButton 등)이라 관행과 정렬된다.

방침 (일괄 치환 ❌ — 성격별 선별)

  • 버튼형(탭→액션/이동)만 Button으로 전환. 가능하면 WSSComponent 공용에서 고쳐 호출부를 한 번에 커버.
  • 배경 탭(키보드/메뉴/오버레이 닫기)·포커스 세팅은 유지 — Button화하면 의미가 틀린다.
  • 합성/우선순위 민감 구간은 개별 검증(회귀 위험).

전환 시 주의(함정)

  1. press 스타일 회귀Button 기본 눌림 dimming. 시각 동일성 위해 .buttonStyle(.plain) + 필요 시 no-op 커스텀 ButtonStyle.
  2. 제스처 우선순위 — 조상 onTapGesture 밑 자식을 Button화하면 히트테스트 우선순위가 바뀜(WSSComponent/CLAUDE.md "Button은 조상의 onTapGesture보다 우선").
  3. 전환 후 snapshot_ui로 button role 실제 인식 확인까지가 완료.

대상 후보 — 버튼형 (전환 후보, 최종 범위는 리뷰로 확정)

Feature

  • CollectionFeature/.../CollectionMyLibrarySelectView.swift:108 — toggleNovel (이미 accessibilityLabel 우회)
  • CollectionFeature/.../CollectionSearchNovelView.swift:219 — toggleNovel
  • FeedFeature/CreateFeed/CreateFeedView.swift:297 — 사진 추가
  • FeedFeature/CreateFeed/CreateFeedView.swift:407 — 소설 연결 열기
  • FeedFeature/CreateFeed/CreateFeedView.swift:434 — 연결 소설 제거
  • FeedFeature/FeedDetail/FeedDetailAttachImageBlock.swift:32,43,59 — 이미지 탭(3)
  • FeedFeature/FeedDetail/FeedDetailView.swift:76 — ⋯ 메뉴 열기
  • FeedFeature/FeedDetail/FeedDetailView.swift:200 — 소설 탭
  • FeedFeature/SosoFeed/MyFeedFilterSheet.swift:123 — 필터 항목
  • FeedFeature/SosoFeed/SosoFeedView.swift:178 — 탭 선택
  • NovelDetailFeature/.../NovelDetailFeedTab.swift:85 — 피드 탭(background GeometryReader 주의)
  • SearchFeature/.../DetailSearchResultView.swift:89 — 필터 재조정
  • SettingFeature/.../WithdrawReasonView.swift:176 — custom 사유 선택
  • SettingFeature/.../NotificationSettingView.swift:124 — navigate
  • SettingFeature/.../SettingMenuRow.swift:46 — 메뉴 행

UI/WSSComponent (공용 — 다수 호출부 커버)

  • WSSComponent/Alert/View/WSSAlertView.swift:56 — 알럿 버튼
  • WSSComponent/Button/WSSPillBadge.swift:75 — action(nil 전파 로직 주의)
  • WSSComponent/Button/WSSToggleButton.swift:29 — 토글
  • WSSComponent/KeywordChips/CapsuleSelectableKeywordChip.swift:52
  • WSSComponent/KeywordChips/PrimaryRemovableKeywordChip.swift:42
  • WSSComponent/KeywordChips/RectangleSelectableKeywordChip.swift:49 — onChange 애니메이션 주의
  • WSSComponent/KeywordChips/WhiteRemovableKeywordChip.swift:46
  • WSSComponent/NovelCell/WSSNovelSelectRow.swift:68

주의 대상 — 합성/우선순위 민감 (전환하려면 개별 검증)

  • FeedFeature/SosoFeed/SosoFeedView.swift:328 — 셀 전체 탭(피드 상세). 자식 좋아요/프로필 Button과 중첩 위험
  • NovelDetailFeature/.../NovelDetailReviewSection.swift:77 — 바깥 탭 + 안쪽 상태 Button 공존

제외 — 배경 탭(닫기/키보드) · 포커스 세팅 (유지)

  • 배경/닫기: CollectionDetailView:602, CreateCollectionView:160, CollectionSearchNovelView:93,187, CreateFeedConnectNovelSheet:92,143, CreateFeedView:99, FeedDetailView:105, SosoFeedView:423, NovelDetailView:417,449,467,547, NicknameView:69, NormalSearchAutoCompletionView:47, NormalSearchView:111, WithdrawReasonView:101, MyPageEditView:146, UserFeedListView:155, UserPageView:660,679
  • 포커스 세팅: CreateCollectionView:254, CreateFeedView:287, FeedDetailCommentInputBar:64, MyPageEditView:244, ReadingPeriodSheet:155(경계선)
  • 의도적 유지(주석 근거): NovelNotificationRow:41(체크 아이콘 애니메이션 위해 Button 회피)

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

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions