diff --git a/SodaLive/Sources/Live/Room/Dialog/LiveRoomDonationRankingItemView.swift b/SodaLive/Sources/Live/Room/Dialog/LiveRoomDonationRankingItemView.swift index 79128e3..216cb88 100644 --- a/SodaLive/Sources/Live/Room/Dialog/LiveRoomDonationRankingItemView.swift +++ b/SodaLive/Sources/Live/Room/Dialog/LiveRoomDonationRankingItemView.swift @@ -14,17 +14,11 @@ struct LiveRoomDonationRankingItemView: View { let item: GetLiveRoomDonationItem let itemCount: Int - let rankingCrawns = ["ic_crown_1", "ic_crown_2", "ic_crown_3"] - let rankingColors = [ - [Color(hex: "ffdc00"), Color(hex: "ffb600")], - [Color(hex: "ffffff"), Color(hex: "9f9f9f")], - [Color(hex: "e6a77a"), Color(hex: "c67e4a")], - [Color(hex: "ffffff").opacity(0), Color(hex: "ffffff").opacity(0)] - ] + let crowns = ["img_rank_1", "img_rank_2", "img_rank_3"] var body: some View { HStack(spacing: 0) { - ZStack { + ZStack(alignment: .center) { KFImage(URL(string: item.profileImage)) .cancelOnDisappear(true) .downsampling(size: CGSize(width: 60, height: 60)) @@ -32,26 +26,14 @@ struct LiveRoomDonationRankingItemView: View { .scaledToFill() .frame(width: 60, height: 60, alignment: .top) .clipShape(Circle()) - .overlay( - Circle() - .stroke( - AngularGradient(colors: rankingColors[index < 4 ? index : 3], center: .center), - lineWidth: 3 - ) - ) if index < 3 { - VStack(alignment: .trailing, spacing: 0) { - Spacer() - - Image(rankingCrawns[index]) - .resizable() - .frame(width: 25, height: 25) - } - .frame(width: 63, height: 63, alignment: .trailing) + Image(crowns[index]) + .resizable() + .frame(width: 77, height: 75) } } - .frame(width: 63, height: 63) + .frame(width: 77, height: 75) Text("\(index + 1)") .appFont(size: 13.3, weight: .bold) diff --git a/SodaLive/Sources/Live/Room/Dialog/LiveRoomHeartRankingItemView.swift b/SodaLive/Sources/Live/Room/Dialog/LiveRoomHeartRankingItemView.swift index 63f4b58..c16fa43 100644 --- a/SodaLive/Sources/Live/Room/Dialog/LiveRoomHeartRankingItemView.swift +++ b/SodaLive/Sources/Live/Room/Dialog/LiveRoomHeartRankingItemView.swift @@ -14,17 +14,11 @@ struct LiveRoomHeartRankingItemView: View { let item: GetLiveRoomHeartListItem let itemCount: Int - let rankingCrawns = ["ic_crown_1", "ic_crown_2", "ic_crown_3"] - let rankingColors = [ - [Color(hex: "ffdc00"), Color(hex: "ffb600")], - [Color(hex: "ffffff"), Color(hex: "9f9f9f")], - [Color(hex: "e6a77a"), Color(hex: "c67e4a")], - [Color(hex: "ffffff").opacity(0), Color(hex: "ffffff").opacity(0)] - ] + let crowns = ["img_rank_1", "img_rank_2", "img_rank_3"] var body: some View { HStack(spacing: 0) { - ZStack { + ZStack(alignment: .center) { KFImage(URL(string: item.profileImage)) .cancelOnDisappear(true) .downsampling(size: CGSize(width: 60, height: 60)) @@ -32,26 +26,14 @@ struct LiveRoomHeartRankingItemView: View { .scaledToFill() .frame(width: 60, height: 60, alignment: .top) .clipShape(Circle()) - .overlay( - Circle() - .stroke( - AngularGradient(colors: rankingColors[index < 4 ? index : 3], center: .center), - lineWidth: 3 - ) - ) if index < 3 { - VStack(alignment: .trailing, spacing: 0) { - Spacer() - - Image(rankingCrawns[index]) - .resizable() - .frame(width: 25, height: 25) - } - .frame(width: 63, height: 63, alignment: .trailing) + Image(crowns[index]) + .resizable() + .frame(width: 77, height: 75) } } - .frame(width: 63, height: 63) + .frame(width: 77, height: 75) Text("\(index + 1)") .appFont(size: 13.3, weight: .bold) diff --git a/docs/20260318_라이브룸후원하트랭킹왕관UI동일화.md b/docs/20260318_라이브룸후원하트랭킹왕관UI동일화.md new file mode 100644 index 0000000..4221f28 --- /dev/null +++ b/docs/20260318_라이브룸후원하트랭킹왕관UI동일화.md @@ -0,0 +1,22 @@ +# 라이브룸 후원/하트 랭킹 왕관 UI 동일화 + +- [x] `UserProfileDonationAllItemView`의 왕관 UI 기준(`img_rank_1~3`, 오버레이 크기/정렬)을 확인한다. + - QA: 기준 코드에서 `ZStack(alignment: .center)` + `Image(crowns[index]).frame(width: 77, height: 75)` 구조 확인. +- [x] `LiveRoomDonationRankingItemView`의 왕관 표시를 기준 UI와 완전히 동일하게 변경한다. + - QA: 1~3위에서 `img_rank_1~3` 사용, 프로필 위 오버레이 프레임 `77x75`, 기존 원형 그라데이션 테두리 제거 확인. +- [x] 라이브 하트 랭킹 경로의 왕관 표시를 기준 UI와 완전히 동일하게 변경한다. + - QA: 하트 랭킹 아이템의 1~3위에서도 `img_rank_1~3` + `77x75` 오버레이가 동일하게 적용되는지 확인. +- [x] 변경 파일 진단/빌드/테스트를 수행하고 결과를 기록한다. + - QA: `lsp_diagnostics`(변경 파일), `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build`, `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" test` 실행 결과 기록. + +--- + +## 검증 기록 + +- 기준 확인: `SodaLive/Sources/Explorer/Profile/UserProfileDonationAllView.swift`의 `UserProfileDonationAllItemView`에서 `crowns = ["img_rank_1", "img_rank_2", "img_rank_3"]`, `ZStack(alignment: .center)`, 왕관 오버레이 `frame(width: 77, height: 75)` 구조를 기준으로 확인. +- 코드 변경: `SodaLive/Sources/Live/Room/Dialog/LiveRoomDonationRankingItemView.swift`에서 `ic_crown_1~3` + 원형 그라데이션 테두리(`AngularGradient`)를 제거하고 `img_rank_1~3` 오버레이(`77x75`) 구조로 변경. +- 코드 변경: `SodaLive/Sources/Live/Room/Dialog/LiveRoomHeartRankingItemView.swift`에서 `ic_crown_1~3` + 원형 그라데이션 테두리를 제거하고 `img_rank_1~3` 오버레이(`77x75`) 구조로 변경. +- 수동 확인(코드 기반): 두 파일 모두 `img_rank_1~3`/`frame(width: 77, height: 75)`가 존재하고 `ic_crown_`, `AngularGradient`가 미존재함을 검색으로 확인. +- 진단 확인: `lsp_diagnostics` 실행 결과 두 변경 파일 모두 `No such module 'Kingfisher'` 1건씩 동일하게 표시됨(로컬 SourceKit 환경 이슈로 기록). +- 빌드 검증: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build` 실행 결과 `** BUILD SUCCEEDED **` 확인. +- 테스트 검증: `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" test` 실행 결과 `Scheme SodaLive is not currently configured for the test action.` 확인.