Skip to content

Commit 36a1f2e

Browse files
authored
Merge pull request #54 from Nexters/feature/#41-밈꾸-텍스트-추가
[Feature/#41] 밈꾸 텍스트 추가
2 parents 4cb6475 + 1100b24 commit 36a1f2e

File tree

13 files changed

+914
-39
lines changed

13 files changed

+914
-39
lines changed

Meme/Meme.xcodeproj/project.pbxproj

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,14 @@
3737
2C1B78122E50A05A00E6C1B3 /* CategoryMemeUseCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C1B78092E4F29CF00E6C1B3 /* CategoryMemeUseCase.swift */; };
3838
2C1B78132E50CD2400E6C1B3 /* UIViewController++Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD9FC4E82E4F19B0008894E7 /* UIViewController++Extension.swift */; };
3939
2C1B78142E50CD2700E6C1B3 /* MemeMainMostSharedNestedCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD9FC4E52E4E46DD008894E7 /* MemeMainMostSharedNestedCell.swift */; };
40+
2C1B78192E57526F00E6C1B3 /* EditToolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C1B78182E57526F00E6C1B3 /* EditToolView.swift */; };
41+
2C1B781A2E57526F00E6C1B3 /* EditToolView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C1B78182E57526F00E6C1B3 /* EditToolView.swift */; };
42+
2C1B781C2E57592300E6C1B3 /* UserTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C1B781B2E57592300E6C1B3 /* UserTextView.swift */; };
43+
2C1B781D2E57592300E6C1B3 /* UserTextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C1B781B2E57592300E6C1B3 /* UserTextView.swift */; };
44+
2C1B781F2E577D9D00E6C1B3 /* TouchHandleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C1B781E2E577D9D00E6C1B3 /* TouchHandleView.swift */; };
45+
2C1B78202E577D9D00E6C1B3 /* TouchHandleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C1B781E2E577D9D00E6C1B3 /* TouchHandleView.swift */; };
46+
2C1B78222E58939E00E6C1B3 /* TextStylePanelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C1B78212E58939E00E6C1B3 /* TextStylePanelView.swift */; };
47+
2C1B78232E58939E00E6C1B3 /* TextStylePanelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C1B78212E58939E00E6C1B3 /* TextStylePanelView.swift */; };
4048
2C3981D32E3B5EA8007BDE92 /* ThumbnailType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C3981D22E3B5EA8007BDE92 /* ThumbnailType.swift */; };
4149
2C3981D42E3B5EA8007BDE92 /* ThumbnailType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C3981D22E3B5EA8007BDE92 /* ThumbnailType.swift */; };
4250
2C3981D92E3B61F7007BDE92 /* UIView++Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C3981D82E3B61F7007BDE92 /* UIView++Extension.swift */; };
@@ -93,6 +101,8 @@
93101
2C67675D2E37B5D100794E10 /* CustomColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C67675B2E37B5D100794E10 /* CustomColor.swift */; };
94102
2C67675F2E37B8A000794E10 /* CustomColorConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C67675E2E37B8A000794E10 /* CustomColorConvertible.swift */; };
95103
2C6767602E37B8A000794E10 /* CustomColorConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C67675E2E37B8A000794E10 /* CustomColorConvertible.swift */; };
104+
2CAB73342E5818E00025B648 /* TextEditView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CAB73332E5818E00025B648 /* TextEditView.swift */; };
105+
2CAB73352E5818E00025B648 /* TextEditView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CAB73332E5818E00025B648 /* TextEditView.swift */; };
96106
2CAC9F432E48C8BF00D7C1F6 /* SearchPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CAC9F422E48C8BF00D7C1F6 /* SearchPage.swift */; };
97107
2CAC9F442E48C8BF00D7C1F6 /* SearchPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CAC9F422E48C8BF00D7C1F6 /* SearchPage.swift */; };
98108
2CAC9F482E48DFBE00D7C1F6 /* MemeCategoryViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2CAC9F472E48DFBE00D7C1F6 /* MemeCategoryViewController.swift */; };
@@ -234,6 +244,10 @@
234244
2C1B78052E4F295100E6C1B3 /* CategoryViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CategoryViewModel.swift; sourceTree = "<group>"; };
235245
2C1B78092E4F29CF00E6C1B3 /* CategoryMemeUseCase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CategoryMemeUseCase.swift; sourceTree = "<group>"; };
236246
2C1B780F2E4F2A3D00E6C1B3 /* CategoryMemeUseCaseInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CategoryMemeUseCaseInterface.swift; sourceTree = "<group>"; };
247+
2C1B78182E57526F00E6C1B3 /* EditToolView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditToolView.swift; sourceTree = "<group>"; };
248+
2C1B781B2E57592300E6C1B3 /* UserTextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserTextView.swift; sourceTree = "<group>"; };
249+
2C1B781E2E577D9D00E6C1B3 /* TouchHandleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TouchHandleView.swift; sourceTree = "<group>"; };
250+
2C1B78212E58939E00E6C1B3 /* TextStylePanelView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextStylePanelView.swift; sourceTree = "<group>"; };
237251
2C3981D22E3B5EA8007BDE92 /* ThumbnailType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThumbnailType.swift; sourceTree = "<group>"; };
238252
2C3981D82E3B61F7007BDE92 /* UIView++Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView++Extension.swift"; sourceTree = "<group>"; };
239253
2C3981DB2E3B6495007BDE92 /* RandomColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RandomColor.swift; sourceTree = "<group>"; };
@@ -261,6 +275,7 @@
261275
2C6767572E37B0E600794E10 /* Color.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Color.xcassets; sourceTree = "<group>"; };
262276
2C67675B2E37B5D100794E10 /* CustomColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomColor.swift; sourceTree = "<group>"; };
263277
2C67675E2E37B8A000794E10 /* CustomColorConvertible.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomColorConvertible.swift; sourceTree = "<group>"; };
278+
2CAB73332E5818E00025B648 /* TextEditView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextEditView.swift; sourceTree = "<group>"; };
264279
2CAC9F422E48C8BF00D7C1F6 /* SearchPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchPage.swift; sourceTree = "<group>"; };
265280
2CAC9F472E48DFBE00D7C1F6 /* MemeCategoryViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemeCategoryViewController.swift; sourceTree = "<group>"; };
266281
2CAC9F4B2E48E12500D7C1F6 /* MemeCategorySection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MemeCategorySection.swift; sourceTree = "<group>"; };
@@ -490,6 +505,7 @@
490505
2C3981E42E3B757C007BDE92 /* SearchResultView.swift */,
491506
2C5F23FD2E3D0774000AA318 /* SearchTextField.swift */,
492507
2C14ED042E438E9A009B605C /* DebounceTextField.swift */,
508+
2C1B781E2E577D9D00E6C1B3 /* TouchHandleView.swift */,
493509
);
494510
path = View;
495511
sourceTree = "<group>";
@@ -857,6 +873,10 @@
857873
isa = PBXGroup;
858874
children = (
859875
AD9FC4F32E4F5E23008894E7 /* MemeCustomViewController.swift */,
876+
2C1B78182E57526F00E6C1B3 /* EditToolView.swift */,
877+
2C1B781B2E57592300E6C1B3 /* UserTextView.swift */,
878+
2CAB73332E5818E00025B648 /* TextEditView.swift */,
879+
2C1B78212E58939E00E6C1B3 /* TextStylePanelView.swift */,
860880
);
861881
path = View;
862882
sourceTree = "<group>";
@@ -1112,6 +1132,7 @@
11121132
ADE8E7A92E4397F8008F0A24 /* MemeMainTopRatedDecorationView.swift in Sources */,
11131133
2C5EB08A2E3FA1EE00D37F94 /* MemeSearchViewController.swift in Sources */,
11141134
2CFAA3252E3654BC004E4604 /* UIFont++Extension.swift in Sources */,
1135+
2C1B781F2E577D9D00E6C1B3 /* TouchHandleView.swift in Sources */,
11151136
2C5F24332E3F99B1000AA318 /* Provider.swift in Sources */,
11161137
AD848E432E2C9B2A0003F09F /* LobbyUseCase.swift in Sources */,
11171138
ADE8E7AC2E439B68008F0A24 /* MemeMainMostsharedHeaderView.swift in Sources */,
@@ -1126,10 +1147,14 @@
11261147
2C39822F2E406164007BDE92 /* MemeSearchGridCell.swift in Sources */,
11271148
2CFAA3142E34A964004E4604 /* CustomFont.swift in Sources */,
11281149
2C5F24212E3F98BD000AA318 /* APIResponse.swift in Sources */,
1150+
2C1B781A2E57526F00E6C1B3 /* EditToolView.swift in Sources */,
11291151
AD9FC4DE2E4A1E07008894E7 /* TopRatedUseCase.swift in Sources */,
1152+
2CAB73352E5818E00025B648 /* TextEditView.swift in Sources */,
11301153
AD848E482E2C9D1D0003F09F /* MemeMainViewModel.swift in Sources */,
11311154
ADE8E7A02E438AD4008F0A24 /* MemeMainPageControlFooterView.swift in Sources */,
1155+
2C1B781C2E57592300E6C1B3 /* UserTextView.swift in Sources */,
11321156
ADE8E7892E4225E3008F0A24 /* MemeMainViewController.swift in Sources */,
1157+
2C1B78232E58939E00E6C1B3 /* TextStylePanelView.swift in Sources */,
11331158
2CFAA31B2E365459004E4604 /* CustomFontConvertible.swift in Sources */,
11341159
2C5F242C2E3F995F000AA318 /* BaseTargetType.swift in Sources */,
11351160
2C6767542E37A07E00794E10 /* PaddingLabel.swift in Sources */,
@@ -1150,6 +1175,7 @@
11501175
2C5EB08D2E3FA25F00D37F94 /* MemeSearchViewController.swift in Sources */,
11511176
2C5EB08E2E3FA25F00D37F94 /* BaseViewController.swift in Sources */,
11521177
2C5F24002E3D15E5000AA318 /* Galmuri.swift in Sources */,
1178+
2C1B78202E577D9D00E6C1B3 /* TouchHandleView.swift in Sources */,
11531179
AD9FC4F02E4F54F4008894E7 /* CallbackJavaScript.swift in Sources */,
11541180
2C1B78112E4F2A3D00E6C1B3 /* CategoryMemeUseCaseInterface.swift in Sources */,
11551181
2C3981E02E3B6CEA007BDE92 /* SearchInfoView.swift in Sources */,
@@ -1163,7 +1189,9 @@
11631189
57AABB5E2E50AF1000659128 /* UIViewController++Extension.swift in Sources */,
11641190
2C5F24312E3F99A1000AA318 /* Providable.swift in Sources */,
11651191
AD848E272E2B55CF0003F09F /* APIConfiguration.swift in Sources */,
1192+
2CAB73342E5818E00025B648 /* TextEditView.swift in Sources */,
11661193
ADE8E7A22E438FB8008F0A24 /* MemeMainCategoryHeaderView.swift in Sources */,
1194+
2C1B78222E58939E00E6C1B3 /* TextStylePanelView.swift in Sources */,
11671195
AD848E452E2C9BEC0003F09F /* Lobby.swift in Sources */,
11681196
2C1B77FA2E4F250000E6C1B3 /* CategoryRepositoryInterface.swift in Sources */,
11691197
AD9FC4DB2E4A1BDE008894E7 /* CategoriesUseCase.swift in Sources */,
@@ -1184,6 +1212,7 @@
11841212
ADE8E78D2E423447008F0A24 /* MemeMainBannerCell.swift in Sources */,
11851213
2CAC9F562E4A344F00D7C1F6 /* MemeSearchHeaderView.swift in Sources */,
11861214
2CAC9F5A2E4A35EA00D7C1F6 /* SeparatorDecorationView.swift in Sources */,
1215+
2C1B78192E57526F00E6C1B3 /* EditToolView.swift in Sources */,
11871216
AD848E362E2C93790003F09F /* LobbyResponse.swift in Sources */,
11881217
2C1B78072E4F295100E6C1B3 /* CategoryViewModel.swift in Sources */,
11891218
2CC399A02E2F84BD00D14084 /* KeyChainProperties.swift in Sources */,
@@ -1237,6 +1266,7 @@
12371266
ADE8E79F2E438AD4008F0A24 /* MemeMainPageControlFooterView.swift in Sources */,
12381267
ADE8E78A2E4225E3008F0A24 /* MemeMainViewController.swift in Sources */,
12391268
2CFAA31C2E365459004E4604 /* CustomFontConvertible.swift in Sources */,
1269+
2C1B781D2E57592300E6C1B3 /* UserTextView.swift in Sources */,
12401270
2C6767552E37A07E00794E10 /* PaddingLabel.swift in Sources */,
12411271
AD1AC31D2E561F1500D7D1B1 /* KakaoShareManager.swift in Sources */,
12421272
2C14ECF42E43774B009B605C /* SearchReposioryInterface.swift in Sources */,
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"images" : [
3+
{
4+
"filename" : "icon_delete.svg",
5+
"idiom" : "universal"
6+
}
7+
],
8+
"info" : {
9+
"author" : "xcode",
10+
"version" : 1
11+
}
12+
}
Lines changed: 8 additions & 0 deletions
Loading
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"images" : [
3+
{
4+
"filename" : "icon_more_circle.svg",
5+
"idiom" : "universal"
6+
}
7+
],
8+
"info" : {
9+
"author" : "xcode",
10+
"version" : 1
11+
}
12+
}
Lines changed: 6 additions & 0 deletions
Loading
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"images" : [
3+
{
4+
"filename" : "icon_text.svg",
5+
"idiom" : "universal"
6+
}
7+
],
8+
"info" : {
9+
"author" : "xcode",
10+
"version" : 1
11+
}
12+
}
Lines changed: 3 additions & 0 deletions
Loading
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
//
2+
// TouchHandleView.swift
3+
// Meme
4+
//
5+
// Created by 임현규 on 8/22/25.
6+
//
7+
8+
import UIKit
9+
10+
final class TouchHandleView: UIView {
11+
var hitTestOutset: CGFloat = 50
12+
13+
override init(frame: CGRect) {
14+
super.init(frame: frame)
15+
}
16+
17+
required init?(coder: NSCoder) {
18+
fatalError("init(coder:) has not been implemented")
19+
}
20+
21+
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
22+
super.point(inside: point, with: event)
23+
24+
let touchArea = bounds.insetBy(dx: -hitTestOutset, dy: -hitTestOutset)
25+
return touchArea.contains(point)
26+
}
27+
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
//
2+
// EditToolView.swift
3+
// Meme
4+
//
5+
// Created by 임현규 on 8/21/25.
6+
//
7+
8+
import UIKit
9+
10+
protocol EditToolDelegate: NSObject {
11+
func didTapPenButton()
12+
func didTapTextButton()
13+
}
14+
15+
final class EditToolView: UIView {
16+
weak var delegate: EditToolDelegate?
17+
18+
// MARK: - UI Components
19+
private lazy var penButton: UIButton = {
20+
let button = UIButton()
21+
button.setImage(UIImage(resource: .iconEdit), for: .normal)
22+
button.addTarget(self, action: #selector(didTapPenButton), for: .touchUpInside)
23+
return button
24+
}()
25+
26+
private lazy var textButton: UIButton = {
27+
let button = UIButton()
28+
button.setImage(UIImage(resource: .iconText), for: .normal)
29+
button.addTarget(self, action: #selector(didTapTextButton), for: .touchUpInside)
30+
return button
31+
}()
32+
33+
// MARK: - init
34+
35+
override init(frame: CGRect) {
36+
super.init(frame: frame)
37+
configureUI()
38+
}
39+
40+
required init?(coder: NSCoder) {
41+
fatalError("init(coder:) has not been implemented")
42+
}
43+
44+
@objc func didTapPenButton() {
45+
delegate?.didTapPenButton()
46+
}
47+
48+
@objc func didTapTextButton() {
49+
delegate?.didTapTextButton()
50+
}
51+
}
52+
53+
private extension EditToolView {
54+
func configureUI() {
55+
[ penButton, textButton ].forEach {
56+
addSubview($0)
57+
$0.translatesAutoresizingMaskIntoConstraints = false
58+
}
59+
60+
NSLayoutConstraint.activate([
61+
penButton.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 24),
62+
penButton.centerYAnchor.constraint(equalTo: centerYAnchor),
63+
penButton.widthAnchor.constraint(equalToConstant: 30),
64+
penButton.heightAnchor.constraint(equalToConstant: 30),
65+
66+
textButton.leadingAnchor.constraint(equalTo: penButton.trailingAnchor, constant: 12),
67+
textButton.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -24),
68+
textButton.centerYAnchor.constraint(equalTo: centerYAnchor),
69+
textButton.widthAnchor.constraint(equalToConstant: 30),
70+
textButton.heightAnchor.constraint(equalToConstant: 30),
71+
])
72+
}
73+
}
74+

0 commit comments

Comments
 (0)