fix(live): 라이브룸 후원·하트 랭킹 왕관 UI를 동일화한다
This commit is contained in:
@@ -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])
|
||||
Image(crowns[index])
|
||||
.resizable()
|
||||
.frame(width: 25, height: 25)
|
||||
}
|
||||
.frame(width: 63, height: 63, alignment: .trailing)
|
||||
.frame(width: 77, height: 75)
|
||||
}
|
||||
}
|
||||
.frame(width: 63, height: 63)
|
||||
.frame(width: 77, height: 75)
|
||||
|
||||
Text("\(index + 1)")
|
||||
.appFont(size: 13.3, weight: .bold)
|
||||
|
||||
@@ -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])
|
||||
Image(crowns[index])
|
||||
.resizable()
|
||||
.frame(width: 25, height: 25)
|
||||
}
|
||||
.frame(width: 63, height: 63, alignment: .trailing)
|
||||
.frame(width: 77, height: 75)
|
||||
}
|
||||
}
|
||||
.frame(width: 63, height: 63)
|
||||
.frame(width: 77, height: 75)
|
||||
|
||||
Text("\(index + 1)")
|
||||
.appFont(size: 13.3, weight: .bold)
|
||||
|
||||
22
docs/20260318_라이브룸후원하트랭킹왕관UI동일화.md
Normal file
22
docs/20260318_라이브룸후원하트랭킹왕관UI동일화.md
Normal file
@@ -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.` 확인.
|
||||
Reference in New Issue
Block a user