-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathRoutineCardView.swift
More file actions
166 lines (142 loc) · 6.16 KB
/
Copy pathRoutineCardView.swift
File metadata and controls
166 lines (142 loc) · 6.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
//
// RoutineCardView.swift
// Presentation
//
// Created by 최정인 on 8/16/25.
//
import Domain
import SnapKit
import UIKit
final class RoutineCardView: UIView {
private enum Layout {
static let horizontalMargin: CGFloat = 16
static let cornerRadius: CGFloat = 12
static let headerInfoStackViewSpacing: CGFloat = 10
static let headerInfoStackViewTopSpacing: CGFloat = 14
static let subRoutineStackViewSpacing: CGFloat = 2
static let subRoutineStackViewTopSpacing: CGFloat = 10
static let subRoutineStackViewBottomSpacing: CGFloat = 14
static let subRoutineLabelHeight: CGFloat = 20
static let categoryIconSize: CGFloat = 32
static let plusImageSize: CGFloat = 24
static let plusButtonTopSpacing: CGFloat = 14
static let plusButtonTrailingSpacing: CGFloat = 7
static let plusButtonSize: CGFloat = 32
static let grayLineTopSpacing: CGFloat = 10
static let grayLineHeight: CGFloat = 1
}
private let headerInfoStackView = UIStackView()
private let categoryIconView = RoutineCategoryIcon(routineCategory: .connection)
private let titleLabel = UILabel()
private let editButton = UIButton()
private let deleteButton = UIButton()
private let plusButton = UIButton()
private let grayLine = UIView()
private let subRoutineLabel = UILabel()
private let subRoutineStackView = UIStackView()
init() {
super.init(frame: .zero)
configureAttribute()
configureLayout()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func configureAttribute() {
backgroundColor = .white
layer.masksToBounds = true
layer.cornerRadius = Layout.cornerRadius
headerInfoStackView.axis = .horizontal
headerInfoStackView.spacing = Layout.headerInfoStackViewSpacing
titleLabel.text = "개운하게 일어나기"
titleLabel.font = BitnagilFont(style: .body1, weight: .semiBold).font
titleLabel.textColor = BitnagilColor.gray10
let plusImage = BitnagilIcon.plusIcon?
.resizeAspectFit(to: CGSize(width: Layout.plusImageSize, height: Layout.plusImageSize))
plusButton.setImage(plusImage, for: .normal)
plusButton.tintColor = BitnagilColor.gray10
grayLine.backgroundColor = BitnagilColor.gray97
subRoutineStackView.axis = .vertical
subRoutineStackView.spacing = Layout.subRoutineStackViewSpacing
subRoutineLabel.text = "세부 루틴"
subRoutineLabel.font = BitnagilFont(style: .body2, weight: .medium).font
subRoutineLabel.textColor = BitnagilColor.gray40
subRoutineLabel.snp.makeConstraints { make in
make.height.equalTo(Layout.subRoutineLabelHeight)
}
subRoutineStackView.addArrangedSubview(subRoutineLabel)
["물 마시기", "물 마시기", "물 마시기"].forEach {
let subRoutineTitleLabel = UILabel()
subRoutineTitleLabel.text = "• \($0)"
subRoutineTitleLabel.font = BitnagilFont(style: .body2, weight: .medium).font
subRoutineTitleLabel.textColor = BitnagilColor.gray40
subRoutineTitleLabel.snp.makeConstraints { make in
make.height.equalTo(Layout.subRoutineLabelHeight)
}
subRoutineStackView.addArrangedSubview(subRoutineTitleLabel)
}
}
private func configureLayout() {
[categoryIconView, titleLabel].forEach {
headerInfoStackView.addArrangedSubview($0)
}
addSubview(headerInfoStackView)
addSubview(plusButton)
addSubview(grayLine)
addSubview(subRoutineStackView)
categoryIconView.snp.makeConstraints { make in
make.size.equalTo(Layout.categoryIconSize)
}
headerInfoStackView.snp.makeConstraints { make in
make.top.equalToSuperview().offset(Layout.headerInfoStackViewTopSpacing)
make.leading.equalToSuperview().offset(Layout.horizontalMargin)
}
plusButton.snp.makeConstraints { make in
make.top.equalToSuperview().offset(Layout.plusButtonTopSpacing)
make.trailing.equalToSuperview().inset(Layout.plusButtonTrailingSpacing)
make.size.equalTo(Layout.plusButtonSize)
}
grayLine.snp.makeConstraints { make in
make.top.equalTo(headerInfoStackView.snp.bottom).offset(Layout.grayLineTopSpacing)
make.leading.equalToSuperview().offset(Layout.horizontalMargin)
make.trailing.equalToSuperview().inset(Layout.horizontalMargin)
make.height.equalTo(Layout.grayLineHeight)
}
subRoutineStackView.snp.makeConstraints { make in
make.top.equalTo(grayLine.snp.bottom).offset(Layout.subRoutineStackViewTopSpacing)
make.leading.equalToSuperview().offset(Layout.horizontalMargin)
make.trailing.equalToSuperview().inset(Layout.horizontalMargin)
make.bottom.equalToSuperview().inset(Layout.subRoutineStackViewBottomSpacing)
}
}
}
fileprivate class RoutineCategoryIcon: UIView {
private enum Layout {
static let cornerRadius: CGFloat = 3.76
static let iconSize: CGFloat = 24
}
private let routineCategoryIcon = UIImageView()
private let routineCategory: RoutineCategoryType
init(routineCategory: RoutineCategoryType) {
self.routineCategory = routineCategory
super.init(frame: .zero)
configureAttribute()
configureLayout()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func configureAttribute() {
layer.masksToBounds = true
layer.cornerRadius = Layout.cornerRadius
backgroundColor = routineCategory.iconBackgroundColor ?? BitnagilColor.yellow10
routineCategoryIcon.image = routineCategory.iconImage ?? BitnagilIcon.shineIcon
}
private func configureLayout() {
addSubview(routineCategoryIcon)
routineCategoryIcon.snp.makeConstraints { make in
make.size.equalTo(Layout.iconSize)
make.center.equalToSuperview()
}
}
}