Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
05caf37
๐Ÿššbuild: MissionResultView ํŒŒ์ผ ์ถ”๊ฐ€
yy-ss99 Mar 24, 2026
6924f31
๐Ÿ›fix: AlarmRingView ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ๊ฐ”์„ ์‹œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฉˆ์ถ”๋Š” ๋ฒ„๊ทธ ๊ณ ์นจ
yy-ss99 Mar 24, 2026
915b2ea
๐ŸŒŸfeat: ํ—ค๋” ์ถ”๊ฐ€
yy-ss99 Mar 24, 2026
261caba
๐Ÿššbuild: MissionResult์—์„œ ์“ธ InfoPairView ๊ตฌํ˜„ ๋ฐ ์ถ”๊ฐ€
yy-ss99 Mar 24, 2026
cf9b617
๐Ÿššbuild: StateRowView๋ฅผ ๊ฐ€์ง€๋Š” ๋ทฐ ์ถ”๊ฐ€ ๋ฐ ๊ตฌํ˜„
yy-ss99 Mar 24, 2026
13f9d32
๐ŸŒŸfeat: ๊ธฐ๋ณธ UI ์™„์„ฑ
yy-ss99 Mar 24, 2026
aee6129
๐ŸŒŸfeat: ์„ฑ๊ณต์‹œ ์“ธ ์ƒํƒœ ๋ผ๋ฒจ config ์ถ”๊ฐ€
yy-ss99 Mar 24, 2026
e2816d6
๐ŸŒŸfeat: ์ƒˆ ๋ธŒ๋žœ์น˜๋ฅผ ์œ„ํ•œ ์ปค๋ฐ‹
yy-ss99 Mar 25, 2026
c94470f
Merge branch 'develop' into feature/MissionResultView#6
yy-ss99 Mar 25, 2026
60d454f
๐ŸŒŸfeat: Id ์‚ฌ์šฉํ•ด์„œ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋กœ ๋ทฐ์— ๋„ฃ๋„๋ก ๊ตฌํ˜„ ์™„๋ฃŒ
yy-ss99 Mar 25, 2026
79efc25
๐ŸŒŸfeat: UI ๊ตฌ์„ฑ ๋ณ€๊ฒฝ
yy-ss99 Mar 25, 2026
a4a9e24
๐Ÿššbuild: MissionResultViewController ์ถ”๊ฐ€
yy-ss99 Mar 25, 2026
dee219e
๐ŸŒŸfeat: configuration ์ถ”๊ฐ€ ๋ฐ ์ˆ˜์ •
yy-ss99 Mar 25, 2026
5ee0c31
๐ŸŒŸfeat: configuration ์ˆ˜์ •
yy-ss99 Mar 25, 2026
45c6598
โ™ป๏ธrefactor: Label config ์ ์šฉ
yy-ss99 Mar 25, 2026
bd4614a
๐Ÿฉนchore: ์ฃผ์„ ๋ฐ UI ์ˆ˜์ •
yy-ss99 Mar 25, 2026
b8048ce
๐Ÿฉนchore: ์ƒ˜ํ”Œ๋ฐ์ดํ„ฐ ์ˆ˜์ •
yy-ss99 Mar 25, 2026
5df32de
๐ŸŒŸfeat: LabelConfig ์ˆ˜์ •
yy-ss99 Mar 25, 2026
174f94c
๐Ÿฉนchore: ์ปจ๋ฒค์…˜ ๊ด€๋ จ ์ˆ˜์ • ์™„๋ฃŒ
yy-ss99 Mar 25, 2026
8d6d8a2
๐Ÿฉนchore: ๋„ค์ด๋ฐ ์ˆ˜์ • ์™„๋ฃŒ
yy-ss99 Mar 25, 2026
5d05241
๐ŸŒŸfeat: NotificationCenter ์ฃผ์ž… ๋ฐ›์€ ์ธ์Šคํ„ด์Šค ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝ
yy-ss99 Mar 25, 2026
19f7a3f
๐ŸŒŸfeat: ์˜ค๋ฅ˜์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ˆ˜์ •
yy-ss99 Mar 25, 2026
819045d
๐Ÿฉนchore: ViewController์— ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ ์ œ๊ฑฐ
yy-ss99 Mar 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 67 additions & 0 deletions RocketCall/Util/LabelConfiguration.swift
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,70 @@ extension LabelConfiguration {
lines: 1
)
}

extension LabelConfiguration {
static let sub12 = LabelConfiguration(
font: .systemFont(ofSize: 12, weight: .medium),
color: .subLabel,
lines: 1
)

static let sub14 = LabelConfiguration(
font: .systemFont(ofSize: 14, weight: .medium),
color: .subLabel,
lines: 1
)

static let sub16 = LabelConfiguration(
font: .systemFont(ofSize: 16, weight: .medium),
color: .subLabel,
lines: 1
)

static let main24 = LabelConfiguration(
font: .systemFont(ofSize: 24, weight: .medium),
color: .mainLabel,
lines: 1
)

static let main30 = LabelConfiguration(
font: .systemFont(ofSize: 30, weight: .medium),
color: .mainLabel,
lines: 1
)

static let main24Bold = LabelConfiguration(
font: .systemFont(ofSize: 24, weight: .bold),
color: .mainLabel,
lines: 1
)

static let main30Bold = LabelConfiguration(
font: .systemFont(ofSize: 30, weight: .bold),
color: .mainLabel,
lines: 1
)
}
Comment on lines +41 to +83
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

LabelConfiguration์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ์ˆ˜์˜ ์ •์  ํ”„๋กœํผํ‹ฐ๊ฐ€ ์„ ์–ธ๋˜์–ด ์žˆ์–ด ์ฝ”๋“œ ์ค‘๋ณต์ด ๋งŽ๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ •์  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ์˜ ์–‘์„ ํฌ๊ฒŒ ์ค„์ด๊ณ  ์œ ์—ฐ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์˜ˆ์‹œ:

let subLabel = UILabel(config: .sub(size: 12))
let mainLabel = UILabel(config: .main(size: 24, weight: .bold))
extension LabelConfiguration {
    
    static func sub(size: CGFloat) -> LabelConfiguration {
        return LabelConfiguration(
            font: .systemFont(ofSize: size, weight: .medium),
            color: .subLabel,
            lines: 1
        )
    }
    
    static func main(size: CGFloat, weight: UIFont.Weight = .medium) -> LabelConfiguration {
        return LabelConfiguration(
            font: .systemFont(ofSize: size, weight: weight),
            color: .mainLabel,
            lines: 1
        )
    }
}

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ง„ config๋Š” ์ตœ์†Œํ•œ์˜ ๊ฒƒ๋งŒ ๋‚จ๊ธฐ๊ณ  ํ•จ์ˆ˜ ์ถ”๊ฐ€์™„๋ฃŒ

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

extension LabelConfiguration {
    static let sub12 = LabelConfiguration(
        font: .systemFont(ofSize: 12, weight: .medium),
        color: .subLabel,
        lines: 1
    )
    
    static let sub14 = LabelConfiguration(
        font: .systemFont(ofSize: 14, weight: .medium),
        color: .subLabel,
        lines: 1
    )
    
    static let sub16 = LabelConfiguration(
        font: .systemFont(ofSize: 16, weight: .medium),
        color: .subLabel,
        lines: 1
    )

    static let main24 = LabelConfiguration(
        font: .systemFont(ofSize: 24, weight: .medium),
        color: .mainLabel,
        lines: 1
    )
    
    static let main30 = LabelConfiguration(
        font: .systemFont(ofSize: 30, weight: .medium),
        color: .mainLabel,
        lines: 1
    )

    static let main24Bold = LabelConfiguration(
        font: .systemFont(ofSize: 24, weight: .bold),
        color: .mainLabel,
        lines: 1
    )
    
    static let main30Bold = LabelConfiguration(
        font: .systemFont(ofSize: 30, weight: .bold),
        color: .mainLabel,
        lines: 1
    )
}

/*
 ์‚ฌ์šฉ์˜ˆ์‹œ
 let subLabel = UILabel(config: .sub(size: 12))
 let mainLabel = UILabel(config: .main(size: 24, weight: .bold))
 */
extension LabelConfiguration {
    static func sub(size: CGFloat) -> LabelConfiguration {
        return LabelConfiguration(
            font: .systemFont(ofSize: size, weight: .medium),
            color: .subLabel,
            lines: 1
        )
    }
    
    static func main(size: CGFloat, weight: UIFont.Weight = .medium) -> LabelConfiguration {
        return LabelConfiguration(
            font: .systemFont(ofSize: size, weight: weight),
            color: .mainLabel,
            lines: 1
        )
    }
}


/*
์‚ฌ์šฉ์˜ˆ์‹œ
let subLabel = UILabel(config: .sub(size: 12))
let mainLabel = UILabel(config: .main(size: 24, weight: .bold))
*/
extension LabelConfiguration {
static func sub(size: CGFloat) -> LabelConfiguration {
return LabelConfiguration(
font: .systemFont(ofSize: size, weight: .medium),
color: .subLabel,
lines: 1
)
}

static func main(size: CGFloat, weight: UIFont.Weight = .medium) -> LabelConfiguration {
return LabelConfiguration(
font: .systemFont(ofSize: size, weight: weight),
color: .mainLabel,
lines: 1
)
}
}
14 changes: 14 additions & 0 deletions RocketCall/Util/StateLabelConfiguration.swift
Original file line number Diff line number Diff line change
Expand Up @@ -31,3 +31,17 @@ extension StateLabelConfiguration {
borderColor: UIColor.red
)
}

extension StateLabelConfiguration {
static let success = StateLabelConfiguration(
font: .systemFont(ofSize: 14, weight: .medium),
color: .systemGreen,
backgroundColor: UIColor.systemGreen.withAlphaComponent(0.2)
)

static let failure = StateLabelConfiguration(
font: .systemFont(ofSize: 14, weight: .medium),
color: .systemRed,
backgroundColor: UIColor.systemRed.withAlphaComponent(0.2)
)
}
2 changes: 1 addition & 1 deletion RocketCall/Util/UILabel+.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ extension UILabel {
self.numberOfLines = config.lines
}

convenience init(text: String, config: LabelConfiguration) {
convenience init(text: String = "", config: LabelConfiguration) {
self.init()
self.text = text
apply(config)
Expand Down
69 changes: 61 additions & 8 deletions RocketCall/View/AlarmRingView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,11 @@ final class AlarmRingView: UIView {
private let time: String
private let date: String
private let title: String
private let notificationCenter: NotificationCenter

private let circleContainerView = CircleContainerView(size: 180)

private let AlarmImageView = UIImageView().then {
private let alarmImageView = UIImageView().then {
$0.image = UIImage(systemName: "bell")
$0.tintColor = .white
$0.contentMode = .scaleAspectFit
Expand Down Expand Up @@ -62,7 +63,7 @@ final class AlarmRingView: UIView {

let snoozeButton = RectangleButton(title: "๋‹ค์‹œ ์•Œ๋ฆผ (5๋ถ„)", color: .subLabel).then {
$0.titleLabel?.font = .systemFont(ofSize: 18, weight: .bold)
$0.backgroundColor = UIColor.white.withAlphaComponent(0.08)
$0.backgroundColor = UIColor.white.withAlphaComponent(0.1)
}

private let bottomGuideStackView = UIStackView().then {
Expand All @@ -88,23 +89,76 @@ final class AlarmRingView: UIView {
$0.layer.cornerRadius = 2
}

init(time: String, date: String, title: String) {
init(
time: String,
date: String,
title: String,
notificationCenter: NotificationCenter = .default
) {
self.time = time
self.date = date
self.title = title
self.notificationCenter = notificationCenter
super.init(frame: .zero)

configureUI()
setupLayout()

bindData()

// ์•ฑ ์ƒํƒœ๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๋ถ€๋ถ„
// didBecomeActiveNotification(์•ฑ์ด ๋‹ค์‹œ ํ™œ์„ฑํ™” ๋  ๋•Œ ํ˜ธ์ถœ๋จ)
// ์•ฑ์ด ์ผœ์ง€๋ฉด handleDidBecomeActive๋ฅผ ์‹คํ–‰ํ•˜๋ผ๊ณ  ์„ค์ •ํ•จ
notificationCenter.addObserver(
self,
selector: #selector(handleDidBecomeActive),
name: UIApplication.didBecomeActiveNotification,
object: nil
)

startAnimations()
}

required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

// ์ˆœํ™˜์ฐธ์กฐ๋ฅผ ๋ง‰๋Š” ์˜ต์ €๋ฒ„ ์ œ๊ฑฐ ๋ถ€๋ถ„
deinit {
notificationCenter.removeObserver(self)
}

// ๋ทฐ๊ฐ€ ํ™”๋ฉด์— ๋ถ™๊ณ /๋–จ์–ด์งˆ๋•Œ ํ˜ธ์ถœ๋จ - ํ™”๋ฉด์ด ๋ณด์ด๋Š”๊ฑธ ๋ถ„๊ธฐ๋กœ ์‹คํ–‰์„ ๋‚˜๋ˆ”
override func didMoveToWindow() {
super.didMoveToWindow()

if window != nil {
restartAnimations()
} else {
stopAnimations()
}
}

@objc private func handleDidBecomeActive() {
restartAnimations()
}

// ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ๊ผฌ์ผ ์ˆ˜ ์žˆ๊ธฐ๋•Œ๋ฌธ์— ๋ฉˆ์ถ”๊ณ  ๋‹ค์‹œ ์‹œ์ž‘ํ•ด์•ผํ•จ
private func restartAnimations() {
stopAnimations()
startAnimations()
}

// ํ˜„์žฌ ๊ฐ€์ง„ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ฐ•์ œ ์ข…๋ฃŒ
private func stopAnimations() {
layer.removeAllAnimations()
circleContainerView.layer.removeAllAnimations()
alarmImageView.layer.removeAllAnimations()

// .identity(์›๋ž˜์ƒํƒœ)๋กœ ๋ฐ”๊พธ์–ด์คŒ
circleContainerView.transform = .identity
alarmImageView.transform = .identity
}

private func bindData() {
timeLabel.text = time
dateLabel.text = date
Expand All @@ -115,7 +169,7 @@ final class AlarmRingView: UIView {
backgroundColor = UIColor.background

addSubview(circleContainerView)
circleContainerView.addSubview(AlarmImageView)
circleContainerView.addSubview(alarmImageView)

addSubview(timeLabel)
addSubview(dateLabel)
Expand All @@ -134,7 +188,7 @@ final class AlarmRingView: UIView {
$0.centerX.equalToSuperview()
}

AlarmImageView.snp.makeConstraints {
alarmImageView.snp.makeConstraints {
$0.center.equalToSuperview()
$0.size.equalTo(CGSize(width: 90, height: 90))
}
Expand Down Expand Up @@ -191,10 +245,9 @@ extension AlarmRingView {
delay: 0,
options: [.autoreverse, .repeat, .allowUserInteraction],
animations: {
self.AlarmImageView.transform = CGAffineTransform(scaleX: 1.08, y: 1.08)
self.alarmImageView.transform = CGAffineTransform(scaleX: 1.08, y: 1.08)
}
)
}
}


62 changes: 62 additions & 0 deletions RocketCall/View/MissionResultView/InfoPairView.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
//
// InfoPairView.swift
// RocketCall
//
// Created by Yeseul Jang on 3/24/26.
//
import UIKit
import SnapKit
import Then

// MissionResultView ๊ตฌ์„ฑ์„ ์œ„ํ•œ ๋ทฐ
class InfoPairView: UIView {

private let titleLabel = UILabel().then {
$0.textColor = UIColor.lightGray
$0.font = .systemFont(ofSize: 15, weight: .medium)
}

let dataLabel: UILabel

init(title: String, data: String? = nil, dataLabel: UILabel? = nil) {
self.dataLabel = dataLabel ?? UILabel().then {
$0.textColor = .white
$0.font = .systemFont(ofSize: 15, weight: .bold)
$0.textAlignment = .right
}

super.init(frame: .zero)

titleLabel.text = title
if let data {
self.dataLabel.text = data
}

configureUI()
setLayout()
}

required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

func updateData(_ text: String) {
dataLabel.text = text
}

private func configureUI() {
addSubview(titleLabel)
addSubview(dataLabel)
}

private func setLayout() {
titleLabel.snp.makeConstraints {
$0.leading.centerY.equalToSuperview()
}

dataLabel.snp.makeConstraints {
$0.trailing.centerY.equalToSuperview()
$0.leading.greaterThanOrEqualTo(titleLabel.snp.trailing).offset(15)
}
}
}
Loading
Loading