diff --git a/DontBe-iOS/DontBe-iOS.xcodeproj/project.pbxproj b/DontBe-iOS/DontBe-iOS.xcodeproj/project.pbxproj index b1499aa4..fe96fa7a 100644 --- a/DontBe-iOS/DontBe-iOS.xcodeproj/project.pbxproj +++ b/DontBe-iOS/DontBe-iOS.xcodeproj/project.pbxproj @@ -36,18 +36,21 @@ 2AAEFC992B4A9E3B00C2D323 /* DontBeTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AAEFC982B4A9E3B00C2D323 /* DontBeTabBarController.swift */; }; 2AC9FB1B2B4DE77400D31071 /* AgreementListCustomView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AC9FB1A2B4DE77400D31071 /* AgreementListCustomView.swift */; }; 2AC9FB1F2B4E634A00D31071 /* JoinAgreeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AC9FB1E2B4E634A00D31071 /* JoinAgreeView.swift */; }; + 2F8735402B4BE65300E55552 /* HomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F87353F2B4BE65300E55552 /* HomeView.swift */; }; + 2F8735422B4BE66500E55552 /* HomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F8735412B4BE66500E55552 /* HomeViewController.swift */; }; + 2F8735442B4BE67300E55552 /* HomeViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F8735432B4BE67300E55552 /* HomeViewModel.swift */; }; + 2F8735462B4C34A500E55552 /* HomeCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F8735452B4C34A500E55552 /* HomeCollectionView.swift */; }; + 2F8735482B4C355100E55552 /* HomeCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F8735472B4C355100E55552 /* HomeCollectionViewCell.swift */; }; + 2F87354A2B4C427000E55552 /* UICollectionViewRegisterable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F8735492B4C427000E55552 /* UICollectionViewRegisterable.swift */; }; + 2F87354C2B4D28D700E55552 /* HomeCollectionFooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F87354B2B4D28D700E55552 /* HomeCollectionFooterView.swift */; }; 3C01692A2B4DC82D0075334B /* DontBePopupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C0920DB2B4D78DA003BD080 /* DontBePopupView.swift */; }; 3C0920DE2B4D98CD003BD080 /* DontBeToastView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C0920DD2B4D98CD003BD080 /* DontBeToastView.swift */; }; - 3C2854F72B3A9E8300369C99 /* View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C2854F62B3A9E8300369C99 /* View.swift */; }; - 3C2854F92B3A9E8A00369C99 /* ViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C2854F82B3A9E8A00369C99 /* ViewModel.swift */; }; - 3C2854FB2B3A9E9000369C99 /* Cell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C2854FA2B3A9E9000369C99 /* Cell.swift */; }; 3C2854FD2B3A9FD800369C99 /* ExampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C2854FC2B3A9FD800369C99 /* ExampleViewController.swift */; }; 3C2854FF2B3AA01700369C99 /* ExampleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C2854FE2B3AA01700369C99 /* ExampleView.swift */; }; 3C2855012B3AA0A000369C99 /* ExampleCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C2855002B3AA0A000369C99 /* ExampleCollectionViewCell.swift */; }; 3C35565B2B494F0A0016BA49 /* UIColor+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C35565A2B494F0A0016BA49 /* UIColor+.swift */; }; 3C6192ED2B3A719A00220CEB /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C6192EC2B3A719A00220CEB /* AppDelegate.swift */; }; 3C6192EF2B3A719A00220CEB /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C6192EE2B3A719A00220CEB /* SceneDelegate.swift */; }; - 3C6192F12B3A719A00220CEB /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C6192F02B3A719A00220CEB /* ViewController.swift */; }; 3C6192F62B3A719C00220CEB /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3C6192F52B3A719C00220CEB /* Assets.xcassets */; }; 3C61930A2B3A781300220CEB /* ImageLiterals.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C6193092B3A781300220CEB /* ImageLiterals.swift */; }; 3C61930C2B3A782100220CEB /* StringLiterals.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C61930B2B3A782100220CEB /* StringLiterals.swift */; }; @@ -92,11 +95,15 @@ 2AAEFC982B4A9E3B00C2D323 /* DontBeTabBarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DontBeTabBarController.swift; sourceTree = ""; }; 2AC9FB1A2B4DE77400D31071 /* AgreementListCustomView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AgreementListCustomView.swift; sourceTree = ""; }; 2AC9FB1E2B4E634A00D31071 /* JoinAgreeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JoinAgreeView.swift; sourceTree = ""; }; + 2F87353F2B4BE65300E55552 /* HomeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeView.swift; sourceTree = ""; }; + 2F8735412B4BE66500E55552 /* HomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewController.swift; sourceTree = ""; }; + 2F8735432B4BE67300E55552 /* HomeViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewModel.swift; sourceTree = ""; }; + 2F8735452B4C34A500E55552 /* HomeCollectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeCollectionView.swift; sourceTree = ""; }; + 2F8735472B4C355100E55552 /* HomeCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeCollectionViewCell.swift; sourceTree = ""; }; + 2F8735492B4C427000E55552 /* UICollectionViewRegisterable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UICollectionViewRegisterable.swift; sourceTree = ""; }; + 2F87354B2B4D28D700E55552 /* HomeCollectionFooterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeCollectionFooterView.swift; sourceTree = ""; }; 3C0920DB2B4D78DA003BD080 /* DontBePopupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DontBePopupView.swift; sourceTree = ""; }; 3C0920DD2B4D98CD003BD080 /* DontBeToastView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DontBeToastView.swift; sourceTree = ""; }; - 3C2854F62B3A9E8300369C99 /* View.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = View.swift; sourceTree = ""; }; - 3C2854F82B3A9E8A00369C99 /* ViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewModel.swift; sourceTree = ""; }; - 3C2854FA2B3A9E9000369C99 /* Cell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Cell.swift; sourceTree = ""; }; 3C2854FC2B3A9FD800369C99 /* ExampleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExampleViewController.swift; sourceTree = ""; }; 3C2854FE2B3AA01700369C99 /* ExampleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExampleView.swift; sourceTree = ""; }; 3C2855002B3AA0A000369C99 /* ExampleCollectionViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExampleCollectionViewCell.swift; sourceTree = ""; }; @@ -104,7 +111,6 @@ 3C6192E92B3A719A00220CEB /* DontBe-iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "DontBe-iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 3C6192EC2B3A719A00220CEB /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 3C6192EE2B3A719A00220CEB /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; - 3C6192F02B3A719A00220CEB /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 3C6192F52B3A719C00220CEB /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 3C6192FA2B3A719C00220CEB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 3C6193092B3A781300220CEB /* ImageLiterals.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageLiterals.swift; sourceTree = ""; }; @@ -415,7 +421,10 @@ 3C6193102B3A7A0D00220CEB /* Views */ = { isa = PBXGroup; children = ( - 3C2854F62B3A9E8300369C99 /* View.swift */, + 2F87353F2B4BE65300E55552 /* HomeView.swift */, + 2F8735452B4C34A500E55552 /* HomeCollectionView.swift */, + 2F87354B2B4D28D700E55552 /* HomeCollectionFooterView.swift */, + 2F8735492B4C427000E55552 /* UICollectionViewRegisterable.swift */, ); path = Views; sourceTree = ""; @@ -423,7 +432,7 @@ 3C6193112B3A7A1500220CEB /* ViewControllers */ = { isa = PBXGroup; children = ( - 3C6192F02B3A719A00220CEB /* ViewController.swift */, + 2F8735412B4BE66500E55552 /* HomeViewController.swift */, ); path = ViewControllers; sourceTree = ""; @@ -431,7 +440,7 @@ 3C6193122B3A7A1E00220CEB /* ViewModel */ = { isa = PBXGroup; children = ( - 3C2854F82B3A9E8A00369C99 /* ViewModel.swift */, + 2F8735432B4BE67300E55552 /* HomeViewModel.swift */, ); path = ViewModel; sourceTree = ""; @@ -439,7 +448,7 @@ 3C6193132B3A7A2400220CEB /* Cells */ = { isa = PBXGroup; children = ( - 3C2854FA2B3A9E9000369C99 /* Cell.swift */, + 2F8735472B4C355100E55552 /* HomeCollectionViewCell.swift */, ); path = Cells; sourceTree = ""; @@ -458,8 +467,6 @@ children = ( 3CE9C12B2B4BE7300086E4A3 /* WriteView.swift */, 3CE9C12D2B4C08AE0086E4A3 /* WriteTextView.swift */, - 3C0920DB2B4D78DA003BD080 /* DontBePopupView.swift */, - 3C0920DD2B4D98CD003BD080 /* DontBeToastView.swift */, ); path = Views; sourceTree = ""; @@ -475,6 +482,8 @@ 3CE9C1332B4C4BA90086E4A3 /* Helpers */ = { isa = PBXGroup; children = ( + 3C0920DB2B4D78DA003BD080 /* DontBePopupView.swift */, + 3C0920DD2B4D98CD003BD080 /* DontBeToastView.swift */, 3CE9C1342B4C4BC20086E4A3 /* CircleProgressbar.swift */, 2A2672042B4C3C00009D214F /* CancelBag.swift */, 2A8D70C22B4D7FF5009F4C6C /* BackButton.swift */, @@ -563,15 +572,17 @@ buildActionMask = 2147483647; files = ( 2A8D70CA2B4D9787009F4C6C /* IntroductionView.swift in Sources */, + 2F87354A2B4C427000E55552 /* UICollectionViewRegisterable.swift in Sources */, + 2A8D70CA2B4D9787009F4C6C /* OnboardingEndingView.swift in Sources */, 3C6193172B3A7A7B00220CEB /* UIStackView+.swift in Sources */, 3CE9C12E2B4C08AE0086E4A3 /* WriteTextView.swift in Sources */, 2A8D70BD2B4D61A1009F4C6C /* OnboardingDummy.swift in Sources */, 3C6193152B3A7A6400220CEB /* UIView+.swift in Sources */, 2AC9FB1F2B4E634A00D31071 /* JoinAgreeView.swift in Sources */, - 3C6192F12B3A719A00220CEB /* ViewController.swift in Sources */, 3C61930C2B3A782100220CEB /* StringLiterals.swift in Sources */, + 2F8735462B4C34A500E55552 /* HomeCollectionView.swift in Sources */, + 2F8735422B4BE66500E55552 /* HomeViewController.swift in Sources */, 2A8D70B42B4C999F009F4C6C /* CustomButton.swift in Sources */, - 3C2854FB2B3A9E9000369C99 /* Cell.swift in Sources */, 3C61930A2B3A781300220CEB /* ImageLiterals.swift in Sources */, 2A8D70C52B4D8079009F4C6C /* UIViewController+.swift in Sources */, 2A6D54C12B479B4300F9891E /* adjusted+.swift in Sources */, @@ -588,12 +599,14 @@ 2A8D70B82B4C9A59009F4C6C /* OnboardingViewController.swift in Sources */, 2A2672022B4C3B44009D214F /* ViewModelType.swift in Sources */, 3C6192ED2B3A719A00220CEB /* AppDelegate.swift in Sources */, - 3C2854F72B3A9E8300369C99 /* View.swift in Sources */, + 2F8735402B4BE65300E55552 /* HomeView.swift in Sources */, + 2F8735442B4BE67300E55552 /* HomeViewModel.swift in Sources */, + 2F87354C2B4D28D700E55552 /* HomeCollectionFooterView.swift in Sources */, + 2F8735482B4C355100E55552 /* HomeCollectionViewCell.swift in Sources */, 3CE9C12A2B4BE6780086E4A3 /* WriteViewController.swift in Sources */, 3C2854FD2B3A9FD800369C99 /* ExampleViewController.swift in Sources */, 2AAEFC992B4A9E3B00C2D323 /* DontBeTabBarController.swift in Sources */, 2AAEFC972B4A9C3700C2D323 /* DontBeTabBarItem.swift in Sources */, - 3C2854F92B3A9E8A00369C99 /* ViewModel.swift in Sources */, 3C0920DE2B4D98CD003BD080 /* DontBeToastView.swift in Sources */, 3CE9C1302B4C2F740086E4A3 /* UIImageView+.swift in Sources */, 2A51AE852B4B05AA00FF770A /* SplashViewController.swift in Sources */, diff --git a/DontBe-iOS/DontBe-iOS/Global/Literals/StringLiterals.swift b/DontBe-iOS/DontBe-iOS/Global/Literals/StringLiterals.swift index 27d35673..7198d5ad 100644 --- a/DontBe-iOS/DontBe-iOS/Global/Literals/StringLiterals.swift +++ b/DontBe-iOS/DontBe-iOS/Global/Literals/StringLiterals.swift @@ -57,4 +57,9 @@ enum StringLiterals { static let start = "시작하기" static let finish = "완료하기" } + + enum Toast { + static let uploading = "게시 중..." + static let uploaded = "게시 완료!" + } } diff --git a/DontBe-iOS/DontBe-iOS/Presentation/Write/Views/DontBePopupView.swift b/DontBe-iOS/DontBe-iOS/Presentation/Helpers/DontBePopupView.swift similarity index 79% rename from DontBe-iOS/DontBe-iOS/Presentation/Write/Views/DontBePopupView.swift rename to DontBe-iOS/DontBe-iOS/Presentation/Helpers/DontBePopupView.swift index 913e2bdb..befdb938 100644 --- a/DontBe-iOS/DontBe-iOS/Presentation/Write/Views/DontBePopupView.swift +++ b/DontBe-iOS/DontBe-iOS/Presentation/Helpers/DontBePopupView.swift @@ -75,15 +75,15 @@ final class DontBePopupView: UIView { init(popupTitle: String, popupContent: String, leftButtonTitle: String, rightButtonTitle: String) { super.init(frame: .zero) - setUI() - setHierarchy() - setLayout() - setAddTarget() - popupTitleLabel.text = popupTitle // 팝업 타이틀 popupContentLabel.text = popupContent // 팝업 내용 cancleButton.setTitle(leftButtonTitle, for: .normal) // 팝업 왼쪽 버튼 타이틀 confirmButton.setTitle(rightButtonTitle, for: .normal) // 팝업 오른쪽 버튼 타이틀 + + setUI() + setHierarchy() + setLayout() + setAddTarget() } @available(*, unavailable) @@ -116,26 +116,41 @@ extension DontBePopupView { // 팝업뷰 타이틀이 없는 경우 if popupTitleLabel.text == nil { container.snp.makeConstraints { - $0.leading.trailing.equalToSuperview().inset(24) + $0.leading.trailing.equalToSuperview().inset(24.adjusted) $0.centerY.equalToSuperview() - $0.height.equalTo(140) } popupContentLabel.snp.makeConstraints { - $0.top.equalToSuperview().inset(24) - $0.leading.trailing.equalToSuperview().inset(18) - $0.bottom.equalTo(cancleButton.snp.top).offset(-26) + $0.top.equalToSuperview().inset(24.adjusted) + $0.leading.trailing.equalToSuperview().inset(18.adjusted) + $0.bottom.equalTo(cancleButton.snp.top).offset(-26.adjusted) } buttonStackView.snp.makeConstraints { - $0.leading.trailing.bottom.equalToSuperview().inset(20) - $0.height.equalTo(44) + $0.leading.trailing.bottom.equalToSuperview().inset(20.adjusted) + $0.height.equalTo(44.adjusted) } } else { container.snp.makeConstraints { - $0.leading.trailing.equalToSuperview().inset(24) + $0.leading.trailing.equalToSuperview().inset(24.adjusted) $0.centerY.equalToSuperview() } + + popupTitleLabel.snp.makeConstraints { + $0.top.equalToSuperview().inset(24.adjusted) + $0.leading.trailing.equalToSuperview().inset(18.adjusted) + } + + popupContentLabel.snp.makeConstraints { + $0.top.equalTo(popupTitleLabel.snp.bottom).offset(12.adjusted) + $0.leading.trailing.equalToSuperview().inset(18.adjusted) + $0.bottom.equalTo(cancleButton.snp.top).offset(-26.adjusted) + } + + buttonStackView.snp.makeConstraints { + $0.leading.trailing.bottom.equalToSuperview().inset(20.adjusted) + $0.height.equalTo(44.adjusted) + } } } diff --git a/DontBe-iOS/DontBe-iOS/Presentation/Write/Views/DontBeToastView.swift b/DontBe-iOS/DontBe-iOS/Presentation/Helpers/DontBeToastView.swift similarity index 83% rename from DontBe-iOS/DontBe-iOS/Presentation/Write/Views/DontBeToastView.swift rename to DontBe-iOS/DontBe-iOS/Presentation/Helpers/DontBeToastView.swift index 5c1ca4e1..971da430 100644 --- a/DontBe-iOS/DontBe-iOS/Presentation/Write/Views/DontBeToastView.swift +++ b/DontBe-iOS/DontBe-iOS/Presentation/Helpers/DontBeToastView.swift @@ -15,14 +15,14 @@ final class DontBeToastView: UIView { // MARK: - UI Components - private let container: UIView = { + let container: UIView = { let view = UIView() - view.backgroundColor = .donGray7 - view.layer.cornerRadius = 4 + view.backgroundColor = .donGray3 + view.layer.cornerRadius = 4.adjusted return view }() - private let circleProgressBar: CircleProgressbar = { + let circleProgressBar: CircleProgressbar = { let circle = CircleProgressbar() circle.backgroundColor = .clear circle.circleTintColor = .donPrimary @@ -30,16 +30,16 @@ final class DontBeToastView: UIView { return circle }() - private let checkImageView: UIImageView = { + let checkImageView: UIImageView = { let imageView = UIImageView() imageView.image = ImageLiterals.Toast.icnCheck imageView.contentMode = .scaleAspectFit return imageView }() - private let toastLabel: UILabel = { + let toastLabel: UILabel = { let label = UILabel() - label.text = "게시 중..." + label.text = StringLiterals.Toast.uploading label.textColor = .donBlack label.textAlignment = .center label.font = UIFont.font(.body3) @@ -65,16 +65,17 @@ final class DontBeToastView: UIView { // MARK: - Extensions extension DontBeToastView { - func setUI() { + private func setUI() { checkImageView.alpha = 0 + circleProgressBar.value = 0 } - func setHierarchy() { + private func setHierarchy() { self.addSubview(container) container.addSubviews(circleProgressBar, checkImageView, toastLabel) } - func setLayout() { + private func setLayout() { container.snp.makeConstraints { $0.edges.equalToSuperview() } diff --git a/DontBe-iOS/DontBe-iOS/Presentation/Home/Cells/Cell.swift b/DontBe-iOS/DontBe-iOS/Presentation/Home/Cells/Cell.swift deleted file mode 100644 index 7350d580..00000000 --- a/DontBe-iOS/DontBe-iOS/Presentation/Home/Cells/Cell.swift +++ /dev/null @@ -1,8 +0,0 @@ -// -// Cell.swift -// DontBe-iOS -// -// Created by 변상우 on 12/26/23. -// - -import Foundation diff --git a/DontBe-iOS/DontBe-iOS/Presentation/Home/Cells/HomeCollectionViewCell.swift b/DontBe-iOS/DontBe-iOS/Presentation/Home/Cells/HomeCollectionViewCell.swift new file mode 100644 index 00000000..a176caeb --- /dev/null +++ b/DontBe-iOS/DontBe-iOS/Presentation/Home/Cells/HomeCollectionViewCell.swift @@ -0,0 +1,248 @@ +// +// HomeCollectionViewCell.swift +// DontBe-iOS +// +// Created by yeonsu on 1/8/24. +// + +import UIKit + +import SnapKit + +final class HomeCollectionViewCell: UICollectionViewCell, UICollectionViewRegisterable { + + // MARK: - Properties + + // MARK: - UI Components + + private let backgroundUIView: UIView = { + let view = UIView() + view.backgroundColor = UIColor.donWhite + view.layer.cornerRadius = 8.adjusted + return view + }() + + private let profileImageView: UIImageView = { + let image = UIImageView() + image.contentMode = .scaleAspectFill + image.clipsToBounds = true + image.layer.borderWidth = 1.adjusted + image.layer.borderColor = UIColor.clear.cgColor + image.image = UIImage.checkmark + return image + }() + + private let nicknameLabel: UILabel = { + let label = UILabel() + label.textColor = .donBlack + label.text = "Don't be야 사랑해~" + label.font = .font(.body3) + return label + }() + + private let transparentLabel: UILabel = { + let label = UILabel() + label.textColor = .donGray9 + label.text = "투명도 0%" + label.font = .font(.caption4) + return label + }() + + private let dotLabel: UILabel = { + let label = UILabel() + label.textColor = .donGray9 + label.text = "·" + label.font = .font(.caption4) + return label + }() + + private let timeLabel: UILabel = { + let label = UILabel() + label.textColor = .donGray9 + label.text = "3분 전" + label.font = .font(.caption4) + return label + }() + + private let kebabButton: UIButton = { + let button = UIButton() + button.setImage(ImageLiterals.Posting.btnKebab, for: .normal) + return button + }() + + private let contentTextLabel: UILabel = { + let label = UILabel() + label.textColor = .donBlack + label.text = "돈비를 사용하면 진짜 돈비를 맞을 수 있나요? 저 돈비 맞고 싶어요 돈벼락이 최고입니다. 그나저나 돈비 정말 흥미로운 서비스인 것 같아요 어떻게 이런 기획을 ? 대박 ㄷ ㄷ ㄷ 돈비를 사용하면 진짜 돈비를 맞을 수 있나요?" + label.font = .font(.body4) + label.numberOfLines = 0 + return label + }() + + private lazy var likeStackView: UIStackView = { + let stackView = UIStackView() + stackView.distribution = .equalSpacing + stackView.axis = .horizontal + stackView.spacing = 0 + return stackView + }() + + private let likeButton: UIButton = { + let button = UIButton() + button.setImage(ImageLiterals.Posting.btnFavoriteInActive, for: .normal) + return button + }() + + private let likeNumLabel: UILabel = { + let label = UILabel() + label.textColor = .donGray11 + label.text = "54" + label.font = .font(.caption4) + return label + }() + + private lazy var commentStackView: UIStackView = { + let stackView = UIStackView() + stackView.addArrangedSubviews(commentButton, commentNumLabel) + stackView.distribution = .equalSpacing + stackView.axis = .horizontal + stackView.spacing = 0 + return stackView + }() + + private let commentButton: UIButton = { + let button = UIButton() + button.setImage(ImageLiterals.Posting.btnComment, for: .normal) + return button + }() + + private let commentNumLabel: UILabel = { + let label = UILabel() + label.textColor = .donGray11 + label.text = "54" + label.font = .font(.caption4) + return label + }() + + private let ghostButton: UIButton = { + let button = UIButton() + button.setImage(ImageLiterals.Posting.btnTransparent, for: .normal) + return button + }() + + private let verticalTextBarView: UIView = { + let view = UIView() + view.backgroundColor = UIColor.donPale + return view + }() + + // MARK: - Life Cycles + + override init(frame: CGRect) { + super.init(frame: frame) + + setUI() + setHierarchy() + setLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +// MARK: - Extensions + +extension HomeCollectionViewCell { + func setUI() { + kebabButton.contentMode = .scaleAspectFill + } + + func setHierarchy() { + contentView.addSubviews(backgroundUIView) + + backgroundUIView.addSubviews(profileImageView, + nicknameLabel, + transparentLabel, + dotLabel, + timeLabel, + kebabButton, + contentTextLabel, + commentStackView, + likeStackView, + ghostButton, + verticalTextBarView) + + likeStackView.addArrangedSubviews(likeButton, + likeNumLabel) + } + + func setLayout() { + backgroundUIView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + + profileImageView.snp.makeConstraints { + $0.leading.equalTo(10.adjusted) + $0.top.equalTo(18.adjusted) + $0.size.equalTo(44.adjusted) + } + + nicknameLabel.snp.makeConstraints { + $0.leading.equalTo(profileImageView.snp.trailing).offset(8.adjusted) + $0.top.equalTo(profileImageView.snp.top).offset(4.adjusted) + } + + transparentLabel.snp.makeConstraints { + $0.leading.equalTo(nicknameLabel) + $0.top.equalTo(nicknameLabel.snp.bottom).offset(4.adjusted) + } + + dotLabel.snp.makeConstraints { + $0.leading.equalTo(transparentLabel.snp.trailing).offset(8.adjusted) + $0.top.equalTo(transparentLabel) + } + + timeLabel.snp.makeConstraints { + $0.leading.equalTo(dotLabel.snp.trailing).offset(8.adjusted) + $0.top.equalTo(transparentLabel) + } + + kebabButton.snp.makeConstraints { + $0.top.equalTo(24.adjusted) + $0.trailing.equalToSuperview().inset(12.adjusted) + $0.size.equalTo(34.adjusted) + } + + contentTextLabel.snp.makeConstraints { + $0.top.equalTo(transparentLabel.snp.bottom).offset(8.adjusted) + $0.leading.equalTo(nicknameLabel) + $0.trailing.equalTo(kebabButton.snp.trailing).inset(12.adjusted) + } + + commentStackView.snp.makeConstraints { + $0.top.equalTo(contentTextLabel.snp.bottom).offset(4.adjusted) + $0.height.equalTo(42.adjusted) + $0.trailing.equalTo(likeStackView.snp.leading).offset(-10.adjusted) + } + + likeStackView.snp.makeConstraints { + $0.top.equalTo(commentStackView) + $0.height.equalTo(commentStackView) + $0.trailing.equalTo(kebabButton).inset(8.adjusted) + } + + ghostButton.snp.makeConstraints { + $0.bottom.equalTo(commentStackView.snp.bottom).offset(-4.adjusted) + $0.leading.equalTo(profileImageView) + $0.size.equalTo(44.adjusted) + } + + verticalTextBarView.snp.makeConstraints { + $0.top.equalTo(profileImageView.snp.bottom) + $0.bottom.equalTo(ghostButton.snp.top) + $0.width.equalTo(1.adjusted) + $0.centerX.equalTo(profileImageView) + } + } +} diff --git a/DontBe-iOS/DontBe-iOS/Presentation/Home/ViewControllers/HomeViewController.swift b/DontBe-iOS/DontBe-iOS/Presentation/Home/ViewControllers/HomeViewController.swift new file mode 100644 index 00000000..84f4789d --- /dev/null +++ b/DontBe-iOS/DontBe-iOS/Presentation/Home/ViewControllers/HomeViewController.swift @@ -0,0 +1,166 @@ +// +// HomeViewController.swift +// DontBe-iOS +// +// Created by yeonsu on 1/8/24. +// + +import UIKit + +import SnapKit + +final class HomeViewController: UIViewController { + + // MARK: - Properties + + var tabBarHeight: CGFloat = 0 + var showUploadToastView: Bool = false + + // MARK: - UI Components + + private let myView = HomeView() + private lazy var homeCollectionView = HomeCollectionView().collectionView + private let uploadToastView = DontBeToastView() + + // MARK: - Life Cycles + + override func loadView() { + super.loadView() + + view = myView + } + + override func viewDidLoad() { + super.viewDidLoad() + + getAPI() + setUI() + setHierarchy() + setLayout() + setDelegate() + setNotification() + } + + // MARK: - TabBar Height + + override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + + tabBarHeight = tabBarController?.tabBar.frame.size.height ?? 0 + } +} + +// MARK: - Extensions + +extension HomeViewController { + private func setUI() { + self.view.backgroundColor = UIColor.donGray1 + self.navigationController?.navigationBar.isHidden = true + uploadToastView.alpha = 0 + } + + private func setHierarchy() { + view.addSubviews(homeCollectionView, + uploadToastView) + } + + private func setLayout() { + homeCollectionView.snp.makeConstraints { + $0.top.equalTo(myView.safeAreaLayoutGuide.snp.top).offset(52.adjusted) + $0.bottom.equalTo(tabBarHeight) + $0.width.equalToSuperview() + } + + uploadToastView.snp.makeConstraints { + $0.leading.trailing.equalToSuperview().inset(16.adjusted) + $0.bottom.equalTo(tabBarHeight).inset(6.adjusted) + $0.height.equalTo(44) + } + } + + private func setDelegate() { + homeCollectionView.dataSource = self + homeCollectionView.delegate = self + } + + private func setNotification() { + NotificationCenter.default.addObserver(self, selector: #selector(showToast(_:)), name: WriteViewController.showUploadToastNotification, object: nil) + } + + @objc func showToast(_ notification: Notification) { + if let showToast = notification.userInfo?["showToast"] as? Bool { + if showToast == true { + uploadToastView.alpha = 1 + + var value: Double = 0.0 + let duration: TimeInterval = 1.0 // 애니메이션 기간 (초 단위) + let increment: Double = 0.01 // 증가량 + + // 0에서 1까지 1초 동안 0.01씩 증가하는 애니메이션 블록 + UIView.animate(withDuration: duration, delay: 0.0, options: .curveLinear, animations: { + for i in 1...100 { + DispatchQueue.main.asyncAfter(deadline: .now() + (duration / 100) * TimeInterval(i)) { + value = Double(i) * increment + self.uploadToastView.circleProgressBar.value = value + } + } + }) + + DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { + self.uploadToastView.circleProgressBar.alpha = 0 + self.uploadToastView.checkImageView.alpha = 1 + self.uploadToastView.toastLabel.text = StringLiterals.Toast.uploaded + self.uploadToastView.container.backgroundColor = .donPrimary + } + + UIView.animate(withDuration: 1.0, delay: 3, options: .curveEaseIn) { + self.uploadToastView.alpha = 0 + } + + DispatchQueue.main.asyncAfter(deadline: .now() + 4.0) { + self.uploadToastView.circleProgressBar.alpha = 1 + self.uploadToastView.checkImageView.alpha = 0 + self.uploadToastView.toastLabel.text = StringLiterals.Toast.uploading + self.uploadToastView.container.backgroundColor = .donGray3 + } + } + } + } +} + +// MARK: - Network + +extension HomeViewController { + private func getAPI() { + + } +} + +extension HomeViewController: UICollectionViewDelegate { } + +extension HomeViewController: UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return 10 + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = + HomeCollectionViewCell.dequeueReusableCell(collectionView: collectionView, indexPath: indexPath) + return cell + } + + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { + return CGSize(width: 343.adjusted, height: 210.adjusted) + } + + func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { + guard let footer = homeCollectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionFooter, withReuseIdentifier: "HomeCollectionFooterView", for: indexPath) as? HomeCollectionFooterView else { return UICollectionReusableView() } + return footer + } + + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize { + + return CGSize(width: UIScreen.main.bounds.width, height: 24.adjusted) + + } +} diff --git a/DontBe-iOS/DontBe-iOS/Presentation/Home/ViewControllers/ViewController.swift b/DontBe-iOS/DontBe-iOS/Presentation/Home/ViewControllers/ViewController.swift deleted file mode 100644 index b2724883..00000000 --- a/DontBe-iOS/DontBe-iOS/Presentation/Home/ViewControllers/ViewController.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// ViewController.swift -// DontBe -// -// Created by 변상우 on 12/26/23. -// - -import UIKit - -final class ViewController: UIViewController { - - override func viewDidLoad() { - super.viewDidLoad() - self.view.backgroundColor = .black - // Do any additional setup after loading the view. - } - -} - diff --git a/DontBe-iOS/DontBe-iOS/Presentation/Home/ViewModel/HomeViewModel.swift b/DontBe-iOS/DontBe-iOS/Presentation/Home/ViewModel/HomeViewModel.swift new file mode 100644 index 00000000..ca1bec3b --- /dev/null +++ b/DontBe-iOS/DontBe-iOS/Presentation/Home/ViewModel/HomeViewModel.swift @@ -0,0 +1,8 @@ +// +// HomeViewModel.swift +// DontBe-iOS +// +// Created by yeonsu on 1/8/24. +// + +import Foundation diff --git a/DontBe-iOS/DontBe-iOS/Presentation/Home/ViewModel/ViewModel.swift b/DontBe-iOS/DontBe-iOS/Presentation/Home/ViewModel/ViewModel.swift deleted file mode 100644 index 1a4d35c1..00000000 --- a/DontBe-iOS/DontBe-iOS/Presentation/Home/ViewModel/ViewModel.swift +++ /dev/null @@ -1,8 +0,0 @@ -// -// ViewModel.swift -// DontBe-iOS -// -// Created by 변상우 on 12/26/23. -// - -import Foundation diff --git a/DontBe-iOS/DontBe-iOS/Presentation/Home/Views/HomeCollectionFooterView.swift b/DontBe-iOS/DontBe-iOS/Presentation/Home/Views/HomeCollectionFooterView.swift new file mode 100644 index 00000000..8a725ea8 --- /dev/null +++ b/DontBe-iOS/DontBe-iOS/Presentation/Home/Views/HomeCollectionFooterView.swift @@ -0,0 +1,57 @@ +// +// HomeCollectionFooterView.swift +// DontBe-iOS +// +// Created by yeonsu on 1/9/24. +// + +import UIKit + +final class HomeCollectionFooterView: UICollectionReusableView { + + // MARK: - Properties + + static let identifier = "HomeCollectionFooterView" + + // MARK: - UI Components + + private let footerView: UIView = { + let view = UIView() + view.backgroundColor = .orange + return view + }() + + // MARK: - Life Cycles + + override init(frame: CGRect) { + super.init(frame: frame) + + setUI() + setHierarchy() + setLayout() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +// MARK: - Extensions + +extension HomeCollectionFooterView { + func setUI() { + self.backgroundColor = .donGray1 + } + + func setHierarchy() { + self.addSubviews(footerView) + } + + func setLayout() { + footerView.snp.makeConstraints { + $0.height.equalTo(2.adjusted) + + } + } +} diff --git a/DontBe-iOS/DontBe-iOS/Presentation/Home/Views/HomeCollectionView.swift b/DontBe-iOS/DontBe-iOS/Presentation/Home/Views/HomeCollectionView.swift new file mode 100644 index 00000000..625f669f --- /dev/null +++ b/DontBe-iOS/DontBe-iOS/Presentation/Home/Views/HomeCollectionView.swift @@ -0,0 +1,63 @@ +// +// HomeCollectionView.swift +// DontBe-iOS +// +// Created by yeonsu on 1/8/24. +// + +import UIKit + +final class HomeCollectionView: UIView { + + // MARK: - UI Components + + lazy var collectionView: UICollectionView = { + let flowLayout = UICollectionViewFlowLayout() + flowLayout.minimumLineSpacing = 10 + flowLayout.scrollDirection = .vertical + + let collectionView = UICollectionView(frame: .zero, collectionViewLayout: flowLayout) + collectionView.showsVerticalScrollIndicator = false + collectionView.clipsToBounds = true + collectionView.contentInsetAdjustmentBehavior = .never + collectionView.isUserInteractionEnabled = true + collectionView.allowsSelection = true + collectionView.backgroundColor = UIColor.donGray1 + + return collectionView + }() + + // MARK: - Life Cycles + + override init(frame: CGRect) { + super.init(frame: frame) + + setHierarchy() + setLayout() + setRegisterCell() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +// MARK: - Extensions + +private extension HomeCollectionView { + func setHierarchy() { + addSubviews(collectionView) + } + + func setLayout() { + collectionView.snp.makeConstraints { + $0.edges.equalToSuperview() + } + } + + func setRegisterCell() { + HomeCollectionViewCell.register(collectionView: collectionView) + collectionView.register(HomeCollectionFooterView.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionFooter, withReuseIdentifier: "HomeCollectionFooterView") + } +} diff --git a/DontBe-iOS/DontBe-iOS/Presentation/Home/Views/HomeView.swift b/DontBe-iOS/DontBe-iOS/Presentation/Home/Views/HomeView.swift new file mode 100644 index 00000000..e3a686de --- /dev/null +++ b/DontBe-iOS/DontBe-iOS/Presentation/Home/Views/HomeView.swift @@ -0,0 +1,90 @@ +// +// HomeView.swift +// DontBe-iOS +// +// Created by yeonsu on 1/8/24. +// + +import UIKit + +final class HomeView: UIView { + + // MARK: - Properties + + // MARK: - UI Components + + private let backgroundView: UIView = { + let view = UIView() + view.backgroundColor = .donGray1 + return view + }() + + private let logoImageView: UIImageView = { + let image = UIImageView() + image.contentMode = .scaleAspectFill + image.clipsToBounds = true + image.image = ImageLiterals.Common.logoSymbol + return image + }() + + // MARK: - Life Cycles + + override init(frame: CGRect) { + super.init(frame: frame) + + setUI() + setHierarchy() + setLayout() + setAddTarget() + setRegisterCell() + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + +// MARK: - Extensions + +extension HomeView { + func setUI() { + } + + func setHierarchy() { + addSubviews(backgroundView) + backgroundView.addSubviews(logoImageView) + } + + func setLayout() { + backgroundView.snp.makeConstraints { + $0.top.equalTo(safeAreaLayoutGuide.snp.top) + $0.height.equalTo(44.adjusted) + $0.leading.trailing.equalToSuperview() + } + + logoImageView.snp.makeConstraints { + $0.top.equalToSuperview().inset(12.adjusted) + $0.width.equalTo(22.adjusted) + $0.height.equalTo(24.adjusted) + $0.centerX.equalToSuperview() + } + } + + func setAddTarget() { + + } + + @objc + func buttonTapped() { + + } + + func setRegisterCell() { + + } + + func setDataBind() { + + } +} diff --git a/DontBe-iOS/DontBe-iOS/Presentation/Home/Views/UICollectionViewRegisterable.swift b/DontBe-iOS/DontBe-iOS/Presentation/Home/Views/UICollectionViewRegisterable.swift new file mode 100644 index 00000000..abaa5b2f --- /dev/null +++ b/DontBe-iOS/DontBe-iOS/Presentation/Home/Views/UICollectionViewRegisterable.swift @@ -0,0 +1,30 @@ +// +// UICollectionViewRegisterable.swift +// DontBe-iOS +// +// Created by yeonsu on 1/8/24. +// + +import UIKit + +public protocol UICollectionViewRegisterable where Self: UICollectionViewCell { + static func register(collectionView: UICollectionView) + static func dequeueReusableCell(collectionView: UICollectionView, indexPath: IndexPath) -> Self + static var reuseIdentifier: String { get } +} + +extension UICollectionViewRegisterable { + public static func register(collectionView: UICollectionView) { + collectionView.register(self, forCellWithReuseIdentifier: self.reuseIdentifier) + } + + public static func dequeueReusableCell(collectionView: UICollectionView, indexPath: IndexPath) -> Self { + guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: self.reuseIdentifier, for: indexPath) as? Self else { fatalError()} + return cell + } + + public static var reuseIdentifier: String { + return String(describing: self) + } +} + diff --git a/DontBe-iOS/DontBe-iOS/Presentation/Home/Views/View.swift b/DontBe-iOS/DontBe-iOS/Presentation/Home/Views/View.swift deleted file mode 100644 index 04af40fd..00000000 --- a/DontBe-iOS/DontBe-iOS/Presentation/Home/Views/View.swift +++ /dev/null @@ -1,8 +0,0 @@ -// -// View.swift -// DontBe-iOS -// -// Created by 변상우 on 12/26/23. -// - -import Foundation diff --git a/DontBe-iOS/DontBe-iOS/Presentation/TabBar/DontBeTabBarController.swift b/DontBe-iOS/DontBe-iOS/Presentation/TabBar/DontBeTabBarController.swift index a155c755..94e6790d 100644 --- a/DontBe-iOS/DontBe-iOS/Presentation/TabBar/DontBeTabBarController.swift +++ b/DontBe-iOS/DontBe-iOS/Presentation/TabBar/DontBeTabBarController.swift @@ -22,7 +22,6 @@ final class DontBeTabBarController: UITabBarController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - print("viewWillAppear") self.navigationController?.navigationBar.isHidden = true self.navigationItem.hidesBackButton = true } @@ -118,6 +117,10 @@ extension DontBeTabBarController: UITabBarControllerDelegate { func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) { + if selectedIndex == 1 { + self.selectedIndex = 0 + } + if let selectedViewController = tabBarController.selectedViewController { applyFontColorAttributes(to: selectedViewController.tabBarItem, isSelected: true) } @@ -131,10 +134,6 @@ extension DontBeTabBarController: UITabBarControllerDelegate { } } } - - if selectedIndex == 1 { - self.selectedIndex = 0 - } } func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool { diff --git a/DontBe-iOS/DontBe-iOS/Presentation/TabBar/DontBeTabBarItem.swift b/DontBe-iOS/DontBe-iOS/Presentation/TabBar/DontBeTabBarItem.swift index a6e65e3b..9f6748b9 100644 --- a/DontBe-iOS/DontBe-iOS/Presentation/TabBar/DontBeTabBarItem.swift +++ b/DontBe-iOS/DontBe-iOS/Presentation/TabBar/DontBeTabBarItem.swift @@ -42,7 +42,7 @@ enum DontBeTabBarItem: CaseIterable { var targetViewController: UIViewController? { switch self { - case .home: return ViewController() + case .home: return HomeViewController() case .writing: return nil case .notification: return nil case .myPage: return nil diff --git a/DontBe-iOS/DontBe-iOS/Presentation/Write/ViewControllers/WriteViewController.swift b/DontBe-iOS/DontBe-iOS/Presentation/Write/ViewControllers/WriteViewController.swift index 7616bef5..df1df456 100644 --- a/DontBe-iOS/DontBe-iOS/Presentation/Write/ViewControllers/WriteViewController.swift +++ b/DontBe-iOS/DontBe-iOS/Presentation/Write/ViewControllers/WriteViewController.swift @@ -11,6 +11,8 @@ final class WriteViewController: UIViewController { // MARK: - Properties + static let showUploadToastNotification = Notification.Name("ShowUploadToastNotification") + // MARK: - UI Components private let rootView = WriteView() @@ -28,6 +30,7 @@ final class WriteViewController: UIViewController { getAPI() setUI() setDelegate() + setAddTarget() } override func viewWillAppear(_ animated: Bool) { @@ -44,6 +47,7 @@ extension WriteViewController { func setUI() { self.view.backgroundColor = .donWhite self.title = StringLiterals.Write.writeNavigationTitle + self.navigationController?.navigationBar.tintColor = .donPrimary let backButton = UIBarButtonItem( title: StringLiterals.Write.writeNavigationBarButtonItemTitle, @@ -69,6 +73,10 @@ extension WriteViewController { self.rootView.writeTextView.postButton.addTarget(self, action: #selector(postButtonTapped), for: .touchUpInside) } + func sendData() { + NotificationCenter.default.post(name: WriteViewController.showUploadToastNotification, object: nil, userInfo: ["showToast": true]) + } + @objc func cancleNavigationBarButtonTapped() { // 텍스트가 비어있는 경우 POP @@ -82,6 +90,7 @@ extension WriteViewController { @objc func postButtonTapped() { popupNavigation() + sendData() } @objc diff --git a/DontBe-iOS/DontBe-iOS/Presentation/Write/Views/WriteTextView.swift b/DontBe-iOS/DontBe-iOS/Presentation/Write/Views/WriteTextView.swift index b328ac8b..62003d9e 100644 --- a/DontBe-iOS/DontBe-iOS/Presentation/Write/Views/WriteTextView.swift +++ b/DontBe-iOS/DontBe-iOS/Presentation/Write/Views/WriteTextView.swift @@ -79,6 +79,7 @@ final class WriteTextView: UIView { button.titleLabel?.font = UIFont.font(.body3) button.backgroundColor = .donGray3 button.layer.cornerRadius = 4.adjusted + button.isEnabled = false return button }() @@ -192,9 +193,11 @@ extension WriteTextView: UITextViewDelegate { if textLength == 0 { postButton.setTitleColor(.donGray9, for: .normal) postButton.backgroundColor = .donGray3 + postButton.isEnabled = false } else { postButton.setTitleColor(.donBlack, for: .normal) postButton.backgroundColor = .donPrimary + postButton.isEnabled = true } if textLength < 500 { diff --git a/DontBe-iOS/DontBe-iOS/Presentation/Write/Views/WriteView.swift b/DontBe-iOS/DontBe-iOS/Presentation/Write/Views/WriteView.swift index 885e0fff..fde37a9f 100644 --- a/DontBe-iOS/DontBe-iOS/Presentation/Write/Views/WriteView.swift +++ b/DontBe-iOS/DontBe-iOS/Presentation/Write/Views/WriteView.swift @@ -65,7 +65,7 @@ extension WriteView { } func setAddTarget() { - writeTextView.postButton.addTarget(self, action: #selector(postButtonTapped), for: .touchUpInside) + } @objc diff --git a/README.md b/README.md index b187c197..a8a9c871 100644 --- a/README.md +++ b/README.md @@ -51,13 +51,14 @@ Don't be Coding Convention ➡️ │ ├── SceneDelegate ├── Global │ ├── Extension +│ ├── Protocol │ ├── Literals │ │ ├── ImageLiterals │ │ ├── StringLiterals │ ├── Resources +│ │ ├── Info.plist │ │ ├── Font │ │ ├── Assets -│ │ ├── Info.plist ├── Network │ ├── Foundation │ | ├── Config @@ -66,6 +67,7 @@ Don't be Coding Convention ➡️ │ | ├── DTO | | ├── Service ├── Presentation +│ ├── Helpers │ ├── Scene1(이름) │ │ ├── Views │ │ ├── ViewControllers