diff --git a/WSSiOS/WSSiOS.xcodeproj/project.pbxproj b/WSSiOS/WSSiOS.xcodeproj/project.pbxproj index 60e40f77..0eceed80 100644 --- a/WSSiOS/WSSiOS.xcodeproj/project.pbxproj +++ b/WSSiOS/WSSiOS.xcodeproj/project.pbxproj @@ -196,6 +196,7 @@ 39D4A5E02BDF746C004FC834 /* NovelGenre.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39D4A5DF2BDF746C004FC834 /* NovelGenre.swift */; }; 39D4A5E42BDF90FB004FC834 /* NovelDetailHeaderReviewResultView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39D4A5E32BDF90FB004FC834 /* NovelDetailHeaderReviewResultView.swift */; }; 39DFB0ED2CABDFC000F87951 /* OnboardingGenrePreferenceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39DFB0EC2CABDFC000F87951 /* OnboardingGenrePreferenceView.swift */; }; + 39DFB0EF2CABE47B00F87951 /* OnboardingGenreButtonView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39DFB0EE2CABE47B00F87951 /* OnboardingGenreButtonView.swift */; }; 39E8FD902C742CE100AD6F30 /* NovelDetailHeaderReadStatusButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39E8FD8F2C742CE100AD6F30 /* NovelDetailHeaderReadStatusButton.swift */; }; 39E8FD922C743D8000AD6F30 /* NovelDetailHeaderReadInfoButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 39E8FD912C743D8000AD6F30 /* NovelDetailHeaderReadInfoButton.swift */; }; 39EF97AC2B53E43800D2148B /* Lottie in Frameworks */ = {isa = PBXBuildFile; productRef = 39EF97AB2B53E43800D2148B /* Lottie */; }; @@ -601,6 +602,7 @@ 39D4A5DF2BDF746C004FC834 /* NovelGenre.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NovelGenre.swift; sourceTree = ""; }; 39D4A5E32BDF90FB004FC834 /* NovelDetailHeaderReviewResultView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NovelDetailHeaderReviewResultView.swift; sourceTree = ""; }; 39DFB0EC2CABDFC000F87951 /* OnboardingGenrePreferenceView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingGenrePreferenceView.swift; sourceTree = ""; }; + 39DFB0EE2CABE47B00F87951 /* OnboardingGenreButtonView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingGenreButtonView.swift; sourceTree = ""; }; 39E8FD8F2C742CE100AD6F30 /* NovelDetailHeaderReadStatusButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NovelDetailHeaderReadStatusButton.swift; sourceTree = ""; }; 39E8FD912C743D8000AD6F30 /* NovelDetailHeaderReadInfoButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NovelDetailHeaderReadInfoButton.swift; sourceTree = ""; }; 39F686FB2C6F5BB90065999F /* NovelDetailInfoReviewKeywordView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NovelDetailInfoReviewKeywordView.swift; sourceTree = ""; }; @@ -1453,6 +1455,7 @@ 3931020D2CA5D6CB002CBEA0 /* OnboardingNicknameView.swift */, 393CAC432CA72760004B4DB6 /* OnboardingBirthGenderView.swift */, 39DFB0EC2CABDFC000F87951 /* OnboardingGenrePreferenceView.swift */, + 39DFB0EE2CABE47B00F87951 /* OnboardingGenreButtonView.swift */, 393CAC3F2CA6D10C004B4DB6 /* OnboardingProgressView.swift */, 393CAC472CA72A2E004B4DB6 /* OnboardingGenderButton.swift */, 393CAC3B2CA6AFD8004B4DB6 /* OnboardingBottomButtonView.swift */, @@ -3096,6 +3099,7 @@ CD2D0AB92C7F0279007CF1F1 /* NovelReviewStatusCollectionViewCell.swift in Sources */, 2CCBFA042B4DD73D00D787C2 /* MyPageTallyView.swift in Sources */, 2C2491812B4ADC000096F255 /* StringLiterals.swift in Sources */, + 39DFB0EF2CABE47B00F87951 /* OnboardingGenreButtonView.swift in Sources */, 39F850712C2D39E000E93EBC /* NovelDetailInfoPlatformView.swift in Sources */, 39F850642C28202300E93EBC /* NovelDetailInfoView.swift in Sources */, B9E566052C0452E500DB51FF /* NormalSearchResultView.swift in Sources */, diff --git a/WSSiOS/WSSiOS/Resource/Assets.xcassets/icon/Onboarding/icOnboardingCheck.imageset/Contents.json b/WSSiOS/WSSiOS/Resource/Assets.xcassets/icon/Onboarding/icOnboardingCheck.imageset/Contents.json new file mode 100644 index 00000000..f996bf47 --- /dev/null +++ b/WSSiOS/WSSiOS/Resource/Assets.xcassets/icon/Onboarding/icOnboardingCheck.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "icOnboardingCheck.svg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/WSSiOS/WSSiOS/Source/Presentation/Onboarding/OnboardingView/OnboardingAssistantView/OnboardingGenreButtonView.swift b/WSSiOS/WSSiOS/Source/Presentation/Onboarding/OnboardingView/OnboardingAssistantView/OnboardingGenreButtonView.swift new file mode 100644 index 00000000..3898e71b --- /dev/null +++ b/WSSiOS/WSSiOS/Source/Presentation/Onboarding/OnboardingView/OnboardingAssistantView/OnboardingGenreButtonView.swift @@ -0,0 +1,116 @@ +// +// OnboardingGenreButtonView.swift +// WSSiOS +// +// Created by YunhakLee on 10/1/24. +// + +import UIKit + +import SnapKit +import Then + +final class OnboardingGenreButtonView: UIView { + + //MARK: - Properties + + let genre: NewNovelGenre + + private let buttonHeight: CGFloat = 83 + + //MARK: - Components + + private let genreButton = UIButton() + private let genreImageView = UIImageView() + private let checkImageView = UIImageView() + private let genreLabel = UILabel() + + //MARK: - Life Cycle + + init(genre: NewNovelGenre) { + self.genre = genre + super.init(frame: .zero) + + setUI() + setHierarchy() + setLayout() + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + //MARK: - UI + + private func setUI() { + genreButton.do { + $0.backgroundColor = .wssGray50 + $0.layer.cornerRadius = buttonHeight/2 + $0.layer.borderColor = UIColor.wssPrimary100.cgColor + + genreImageView.do { + $0.image = genre.image + $0.contentMode = .scaleAspectFit + $0.isUserInteractionEnabled = false + } + + checkImageView.do { + $0.image = .icOnboardingCheck + $0.contentMode = .scaleAspectFit + $0.isUserInteractionEnabled = false + $0.isHidden = true + } + } + + genreLabel.do { + $0.applyWSSFont(.title3, with: genre.withKorean) + $0.textColor = .wssGray300 + } + } + + private func setHierarchy() { + self.addSubviews(genreButton, + genreLabel) + genreButton.addSubviews(genreImageView, + checkImageView) + } + + private func setLayout() { + genreButton.snp.makeConstraints { + $0.top.equalToSuperview() + $0.horizontalEdges.equalToSuperview() + $0.size.equalTo(buttonHeight) + + genreImageView.snp.makeConstraints { + $0.center.equalToSuperview() + $0.size.equalTo(44) + } + + checkImageView.snp.makeConstraints { + $0.centerY.equalToSuperview() + $0.size.equalTo(44) + } + } + + genreLabel.snp.makeConstraints { + $0.top.equalTo(genreButton.snp.bottom).inset(10) + $0.centerX.equalToSuperview() + $0.bottom.equalToSuperview() + } + } + + // MARK: - Custom Method + + func updateButton(selectedGenres: [NewNovelGenre]) { + let isSelected = selectedGenres.contains(genre) + + genreButton.do { + $0.backgroundColor = isSelected ? .wssPrimary50 : .wssGray50 + $0.layer.borderWidth = isSelected ? 2 : 0 + } + + checkImageView.isHidden = !isSelected + genreImageView.isHidden = isSelected + } +} +