diff --git a/DontBe-iOS/DontBe-iOS.xcodeproj/project.pbxproj b/DontBe-iOS/DontBe-iOS.xcodeproj/project.pbxproj index c7f25dc0..a9ac330c 100644 --- a/DontBe-iOS/DontBe-iOS.xcodeproj/project.pbxproj +++ b/DontBe-iOS/DontBe-iOS.xcodeproj/project.pbxproj @@ -31,18 +31,21 @@ 2AAA845F2B494AC50098A824 /* SnapKit in Frameworks */ = {isa = PBXBuildFile; productRef = 2AAA845E2B494AC50098A824 /* SnapKit */; }; 2AAEFC972B4A9C3700C2D323 /* DontBeTabBarItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AAEFC962B4A9C3700C2D323 /* DontBeTabBarItem.swift */; }; 2AAEFC992B4A9E3B00C2D323 /* DontBeTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AAEFC982B4A9E3B00C2D323 /* DontBeTabBarController.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 */; }; @@ -82,11 +85,15 @@ 2A8D70CB2B4DA7BD009F4C6C /* UITextField+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITextField+.swift"; sourceTree = ""; }; 2AAEFC962B4A9C3700C2D323 /* DontBeTabBarItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DontBeTabBarItem.swift; sourceTree = ""; }; 2AAEFC982B4A9E3B00C2D323 /* DontBeTabBarController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DontBeTabBarController.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 = ""; }; @@ -94,7 +101,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 = ""; }; @@ -379,7 +385,10 @@ 3C6193102B3A7A0D00220CEB /* Views */ = { isa = PBXGroup; children = ( - 3C2854F62B3A9E8300369C99 /* View.swift */, + 2F87353F2B4BE65300E55552 /* HomeView.swift */, + 2F8735452B4C34A500E55552 /* HomeCollectionView.swift */, + 2F87354B2B4D28D700E55552 /* HomeCollectionFooterView.swift */, + 2F8735492B4C427000E55552 /* UICollectionViewRegisterable.swift */, ); path = Views; sourceTree = ""; @@ -387,7 +396,7 @@ 3C6193112B3A7A1500220CEB /* ViewControllers */ = { isa = PBXGroup; children = ( - 3C6192F02B3A719A00220CEB /* ViewController.swift */, + 2F8735412B4BE66500E55552 /* HomeViewController.swift */, ); path = ViewControllers; sourceTree = ""; @@ -395,7 +404,7 @@ 3C6193122B3A7A1E00220CEB /* ViewModel */ = { isa = PBXGroup; children = ( - 3C2854F82B3A9E8A00369C99 /* ViewModel.swift */, + 2F8735432B4BE67300E55552 /* HomeViewModel.swift */, ); path = ViewModel; sourceTree = ""; @@ -403,7 +412,7 @@ 3C6193132B3A7A2400220CEB /* Cells */ = { isa = PBXGroup; children = ( - 3C2854FA2B3A9E9000369C99 /* Cell.swift */, + 2F8735472B4C355100E55552 /* HomeCollectionViewCell.swift */, ); path = Cells; sourceTree = ""; @@ -413,7 +422,6 @@ children = ( 3CE9C1262B4BE5E60086E4A3 /* Views */, 3CE9C1282B4BE6580086E4A3 /* ViewControllers */, - 3CE9C1272B4BE6400086E4A3 /* ViewModel */, ); path = Write; sourceTree = ""; @@ -429,13 +437,6 @@ path = Views; sourceTree = ""; }; - 3CE9C1272B4BE6400086E4A3 /* ViewModel */ = { - isa = PBXGroup; - children = ( - ); - path = ViewModel; - sourceTree = ""; - }; 3CE9C1282B4BE6580086E4A3 /* ViewControllers */ = { isa = PBXGroup; children = ( @@ -531,15 +532,16 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 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 */, - 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 */, @@ -555,12 +557,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/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..92d5ee0e --- /dev/null +++ b/DontBe-iOS/DontBe-iOS/Presentation/Home/ViewControllers/HomeViewController.swift @@ -0,0 +1,111 @@ +// +// 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 + + // MARK: - UI Components + + private let myView = HomeView() + private lazy var homeCollectionView = HomeCollectionView().collectionView + + // MARK: - Life Cycles + + override func loadView() { + super.loadView() + + view = myView + } + + override func viewDidLoad() { + super.viewDidLoad() + + getAPI() + setUI() + setHierarchy() + setLayout() + setDelegate() + } + + // MARK: - TabBar Height + + override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + + tabBarHeight = tabBarController?.tabBar.frame.size.height ?? 0 + } +} + +// MARK: - Extensions + +extension HomeViewController { + func setUI() { + self.view.backgroundColor = UIColor.donGray1 + self.navigationController?.navigationBar.isHidden = true + } + + func setHierarchy() { + view.addSubviews(homeCollectionView) + } + + func setLayout() { + homeCollectionView.snp.makeConstraints { + $0.top.equalTo(myView.safeAreaLayoutGuide.snp.top).offset(52.adjusted) + $0.bottom.equalTo(tabBarHeight) + $0.width.equalToSuperview() + } + } + + func setDelegate() { + homeCollectionView.dataSource = self + homeCollectionView.delegate = self + } +} + +// MARK: - Network + +extension HomeViewController { + 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..80bafcff 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 } 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