From 90f9aef3d75db31857dc895b904bceadbe730951 Mon Sep 17 00:00:00 2001 From: GI JEONG HONG Date: Sun, 6 Sep 2026 19:39:42 +0900 Subject: [PATCH 1/5] =?UTF-8?q?design:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EB=A6=AC=EB=94=94=EC=9E=90=EC=9D=B8=20UI?= =?UTF-8?q?=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Login/Login/LoginViewController.swift | 246 +++++++++++++----- 1 file changed, 182 insertions(+), 64 deletions(-) diff --git a/Koin/Presentation/Login/Login/LoginViewController.swift b/Koin/Presentation/Login/Login/LoginViewController.swift index 1e1bbb83..f0288ed8 100644 --- a/Koin/Presentation/Login/Login/LoginViewController.swift +++ b/Koin/Presentation/Login/Login/LoginViewController.swift @@ -8,23 +8,46 @@ import Combine import SafariServices import UIKit +import SnapKit final class LoginViewController: UIViewController { - - var completion: (() -> Void)? + // MARK: - Properties private let viewModel: LoginViewModel private let inputSubject: PassthroughSubject = .init() private var subscriptions: Set = [] // MARK: - UI Components + private let scrollView = UIScrollView() + + private let contentView = UIView() + + private let contentTopPaddingLayoutGuide = UILayoutGuide() + private let contentLayoutGuide = UILayoutGuide() + private let contentBottomPaddingLayoutGuide = UILayoutGuide() + private let logoImageView = UIImageView().then { - $0.image = UIImage.appImage(asset: .koinLogo) + $0.image = UIImage.appImage(asset: .bcsdSymbolLogo) + $0.contentMode = .scaleAspectFit + } + + private let logoTextImageView = UIImageView().then { + $0.image = UIImage.appImage(asset: .koinTextLogo) + $0.contentMode = .scaleAspectFit } private let idTextField = UITextField().then { - $0.placeholder = "아이디(Koreatech ID/전화번호)" + $0.attributedPlaceholder = NSAttributedString( + string: "아이디(Koreatech ID/전화번호)", + attributes: [ + .foregroundColor: UIColor.appColor(.neutral400), + .font: UIFont.appFont(.pretendardRegular, size: 16) + ] + ) $0.autocapitalizationType = .none + $0.autocorrectionType = .no + $0.textContentType = .username + $0.textColor = UIColor.appColor(.neutral800) $0.font = UIFont.appFont(.pretendardRegular, size: 16) } @@ -33,18 +56,27 @@ final class LoginViewController: UIViewController { } private let idWarningLabel = UILabel().then { - $0.font = UIFont.appFont(.pretendardRegular, size: 13) - $0.textColor = UIColor.appColor(.sub500) + $0.font = UIFont.appFont(.pretendardRegular, size: 12) + $0.textColor = UIColor.appColor(.new800) } private let passwordTextField = UITextField().then { - $0.placeholder = "비밀번호" + $0.attributedPlaceholder = NSAttributedString( + string: "비밀번호", + attributes: [ + .foregroundColor: UIColor.appColor(.neutral400), + .font: UIFont.appFont(.pretendardRegular, size: 16) + ] + ) + $0.textContentType = .password + $0.textColor = UIColor.appColor(.neutral800) $0.font = UIFont.appFont(.pretendardRegular, size: 16) $0.isSecureTextEntry = true } private let changeSecureButton = UIButton().then { button in button.setImage(UIImage.appImage(asset: .visibility), for: .normal) + button.accessibilityLabel = "비밀번호 보기" } private let separateView2 = UIView().then { @@ -52,18 +84,17 @@ final class LoginViewController: UIViewController { } private let passwordWarningLabel = UILabel().then { - $0.font = UIFont.appFont(.pretendardRegular, size: 13) - $0.numberOfLines = 2 - $0.textColor = UIColor.appColor(.sub500) + $0.font = UIFont.appFont(.pretendardRegular, size: 12) + $0.textColor = UIColor.appColor(.new800) } private let warningImageView = UIImageView().then { - $0.image = UIImage.appImage(asset: .warningOrange) + $0.image = UIImage.appImage(asset: .warningOrange)?.withRenderingMode(.alwaysTemplate).withTintColor(.appColor(.new800)) $0.isHidden = true } private let loginButton = UIButton().then { - $0.backgroundColor = UIColor.appColor(.sub500) + $0.backgroundColor = UIColor.appColor(.new500) $0.setTitle("로그인", for: .normal) $0.setTitleColor(UIColor.appColor(.neutral0), for: .normal) $0.titleLabel?.font = UIFont.appFont(.pretendardRegular, size: 15) @@ -71,40 +102,58 @@ final class LoginViewController: UIViewController { } private let registerButton = UIButton().then { - $0.backgroundColor = UIColor.appColor(.primary500) + $0.backgroundColor = UIColor.appColor(.neutral0) $0.setTitle("회원가입", for: .normal) - $0.setTitleColor(UIColor.appColor(.neutral0), for: .normal) + $0.setTitleColor(UIColor.appColor(.new500), for: .normal) $0.titleLabel?.font = UIFont.appFont(.pretendardRegular, size: 15) + $0.layer.borderColor = UIColor.appColor(.new500).cgColor + $0.layer.borderWidth = 1 $0.layer.cornerRadius = 8 } + private let findButtonsLayoutGuide = UILayoutGuide() + private let findIdButton = UIButton().then { var configuration = UIButton.Configuration.plain() configuration.image = UIImage.appImage(asset: .findId) var text = AttributedString("아이디 찾기") - text.font = UIFont.appFont(.pretendardRegular, size: 13) + text.font = UIFont.appFont(.pretendardRegular, size: 12) configuration.attributedTitle = text - configuration.imagePadding = 1 + configuration.imagePadding = 4 + configuration.contentInsets = .zero configuration.baseForegroundColor = UIColor.appColor(.neutral500) - $0.backgroundColor = .clear $0.configuration = configuration } + private let findSeparatorLabel = UILabel().then { + $0.text = "|" + $0.textColor = .appColor(.neutral500) + $0.font = .appFont(.pretendardRegular, size: 15) + } + private let findPasswordButton = UIButton().then { var configuration = UIButton.Configuration.plain() configuration.image = UIImage.appImage(asset: .findPassword) var text = AttributedString("비밀번호 찾기") - text.font = UIFont.appFont(.pretendardRegular, size: 13) + text.font = UIFont.appFont(.pretendardRegular, size: 12) configuration.attributedTitle = text - configuration.imagePadding = 1 + configuration.imagePadding = 4 + configuration.contentInsets = .zero configuration.baseForegroundColor = UIColor.appColor(.neutral500) - $0.backgroundColor = .clear $0.configuration = configuration } + private let footerLayoutGuide = UILayoutGuide() + + private let ownerButton = UIButton().then { + $0.setTitle("사장님이신가요?", for: .normal) + $0.setTitleColor(UIColor.appColor(.new500), for: .normal) + $0.titleLabel?.font = UIFont.appFont(.pretendardMedium, size: 18) + } + private let copyrightLabel = UILabel().then { $0.text = "Copyright @ BCSD Lab All rights reserved." - $0.textColor = UIColor.appColor(.neutral700) + $0.textColor = UIColor.appColor(.neutral600) $0.font = UIFont.appFont(.pretendardRegular, size: 12) $0.textAlignment = .center } @@ -123,7 +172,7 @@ final class LoginViewController: UIViewController { // MARK: - Life Cycle override func viewDidLoad() { super.viewDidLoad() - navigationItem.title = "로그인" + title = "로그인" configureView() bind() hideKeyboardWhenTappedAround() @@ -132,13 +181,20 @@ final class LoginViewController: UIViewController { registerButton.addTarget(self, action: #selector(registerButtonTapped), for: .touchUpInside) findIdButton.addTarget(self, action: #selector(findIdButtonTapped), for: .touchUpInside) findPasswordButton.addTarget(self, action: #selector(findPasswordButtonTapped), for: .touchUpInside) + ownerButton.addTarget(self, action: #selector(ownerButtonTapped), for: .touchUpInside) idTextField.delegate = self passwordTextField.delegate = self } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - configureNavigationBar(style: .fill) + configureNavigationBar(style: .empty) + } + + override func viewWillDisappear(_ animated: Bool) { + super.viewWillDisappear(animated) + configureNavigationBar(style: .empty + ) } private func bind() { @@ -152,7 +208,6 @@ final class LoginViewController: UIViewController { case .loginSuccess: self?.navigationController?.popViewController(animated: true) self?.inputSubject.send(.logEvent(EventParameter.EventLabel.User.login, .click, "로그인 완료")) - self?.completion?() case .showForceModal: self?.navigationController?.setViewControllers([ForceModifyUserViewController()], animated: true) case .showModifyModal: @@ -209,6 +264,7 @@ extension LoginViewController { @objc private func changeSecureButtonTapped() { passwordTextField.isSecureTextEntry.toggle() changeSecureButton.setImage(passwordTextField.isSecureTextEntry ? UIImage.appImage(asset: .visibility) : UIImage.appImage(asset: .visibilityNon), for: .normal) + changeSecureButton.accessibilityLabel = passwordTextField.isSecureTextEntry ? "비밀번호 보기" : "비밀번호 숨기기" } @objc private func findIdButtonTapped() { @@ -222,6 +278,11 @@ extension LoginViewController { navigationController?.pushViewController(findPasswordViewController, animated: true) inputSubject.send(.logEvent(EventParameter.EventLabel.User.login, .click, "비밀번호 찾기")) } + + @objc private func ownerButtonTapped() { + guard let url = URL(string: "https://owner.koreatech.in") else { return } + present(SFSafariViewController(url: url), animated: true) + } @objc func loginButtonTapped() { warningImageView.isHidden = true @@ -272,27 +333,57 @@ extension LoginViewController { extension LoginViewController { private func setUpLayOuts() { - [logoImageView, idTextField, separateView1, idWarningLabel, passwordTextField, changeSecureButton, separateView2, warningImageView, passwordWarningLabel, loginButton, registerButton, findIdButton, findPasswordButton, copyrightLabel].forEach { + [logoImageView, logoTextImageView, + idTextField, separateView1, passwordTextField, changeSecureButton, separateView2, + warningImageView, idWarningLabel, passwordWarningLabel, + loginButton, registerButton, + findIdButton, findSeparatorLabel, findPasswordButton, + ownerButton, copyrightLabel].forEach { + contentView.addSubview($0) + } + + [contentTopPaddingLayoutGuide, contentLayoutGuide, contentBottomPaddingLayoutGuide, findButtonsLayoutGuide, footerLayoutGuide].forEach { + contentView.addLayoutGuide($0) + } + + [contentView].forEach { + scrollView.addSubview($0) + } + + [scrollView].forEach { view.addSubview($0) } } + private func setUpConstraints() { - logoImageView.snp.makeConstraints { make in - make.top.equalTo(view.safeAreaLayoutGuide.snp.top).offset(110) - make.leading.equalTo(view.snp.leading).offset(40) - make.height.equalTo(60) - make.width.equalTo(107) + scrollView.snp.makeConstraints { + $0.leading.trailing.top.equalToSuperview() + $0.bottom.equalTo(view.keyboardLayoutGuide.snp.top) } - idTextField.snp.makeConstraints { make in - make.top.equalTo(logoImageView.snp.bottom).offset(32) - make.leading.equalTo(view.snp.leading).offset(48) - make.trailing.equalTo(view.snp.trailing).offset(-48) - make.height.equalTo(40) + contentView.snp.makeConstraints { + $0.edges.equalToSuperview() + $0.width.equalTo(scrollView) + $0.height.greaterThanOrEqualTo(view.safeAreaLayoutGuide) + } + + logoImageView.snp.makeConstraints { + $0.top.centerX.equalTo(contentLayoutGuide) + $0.height.equalTo(66) + } + logoTextImageView.snp.makeConstraints { + $0.top.equalTo(logoImageView.snp.bottom).offset(9) + $0.centerX.equalTo(contentLayoutGuide) + $0.width.equalTo(102) + $0.height.equalTo(41) + } + idTextField.snp.makeConstraints { + $0.top.equalTo(logoTextImageView.snp.bottom).offset(52) + $0.leading.trailing.equalTo(contentLayoutGuide).inset(48) + $0.height.equalTo(40) } separateView1.snp.makeConstraints { make in make.top.equalTo(idTextField.snp.bottom) - make.leading.equalTo(idTextField.snp.leading) - make.trailing.equalTo(idTextField.snp.trailing) + make.leading.trailing.equalTo(contentLayoutGuide).inset(48) make.height.equalTo(1) } idWarningLabel.snp.makeConstraints { make in @@ -301,20 +392,18 @@ extension LoginViewController { make.height.equalTo(20) } passwordTextField.snp.makeConstraints { make in - make.top.equalTo(idTextField.snp.bottom).offset(16) - make.leading.equalTo(idTextField.snp.leading) - make.trailing.equalTo(idTextField.snp.trailing) + make.top.equalTo(idTextField.snp.bottom).offset(24) + make.leading.trailing.equalTo(contentLayoutGuide).inset(48) make.height.equalTo(40) } changeSecureButton.snp.makeConstraints { make in make.centerY.equalTo(passwordTextField.snp.centerY) - make.trailing.equalTo(passwordTextField.snp.trailing) - make.width.height.equalTo(20) + make.trailing.equalTo(passwordTextField.snp.trailing).offset(12) + make.width.height.equalTo(44) } separateView2.snp.makeConstraints { make in make.top.equalTo(passwordTextField.snp.bottom) - make.leading.equalTo(passwordTextField.snp.leading) - make.trailing.equalTo(passwordTextField.snp.trailing) + make.leading.trailing.equalTo(contentLayoutGuide).inset(48) make.height.equalTo(1) } warningImageView.snp.makeConstraints { make in @@ -323,45 +412,74 @@ extension LoginViewController { make.width.height.equalTo(16) } passwordWarningLabel.snp.makeConstraints { make in - make.top.equalTo(separateView2.snp.bottom) + make.top.equalTo(separateView2.snp.bottom).offset(8) make.leading.equalTo(warningImageView.snp.trailing).offset(4) make.height.greaterThanOrEqualTo(20) } loginButton.snp.makeConstraints { make in make.top.equalTo(separateView2.snp.bottom).offset(48) - make.leading.equalTo(separateView2.snp.leading) - make.trailing.equalTo(separateView2.snp.trailing) + make.leading.trailing.equalTo(contentLayoutGuide).inset(48) make.height.equalTo(44) } registerButton.snp.makeConstraints { make in make.top.equalTo(loginButton.snp.bottom).offset(24) - make.leading.equalTo(loginButton.snp.leading) - make.trailing.equalTo(loginButton.snp.trailing) + make.leading.trailing.equalTo(contentLayoutGuide).inset(48) make.height.equalTo(44) } - findIdButton.snp.makeConstraints { make in - make.top.equalTo(registerButton.snp.bottom).offset(32) - make.trailing.equalTo(view.snp.centerX).offset(-5) - make.width.greaterThanOrEqualTo(84) - make.height.equalTo(20) + + findIdButton.snp.makeConstraints { + $0.leading.equalTo(findButtonsLayoutGuide) + $0.centerY.equalTo(findButtonsLayoutGuide) } - findPasswordButton.snp.makeConstraints { make in - make.top.equalTo(findIdButton.snp.top) - make.leading.equalTo(view.snp.centerX) - make.width.greaterThanOrEqualTo(100) - make.height.equalTo(20) + findSeparatorLabel.snp.makeConstraints { + $0.top.bottom.equalTo(findButtonsLayoutGuide) + $0.leading.equalTo(findIdButton.snp.trailing).offset(10) + } + findPasswordButton.snp.makeConstraints { + $0.leading.equalTo(findSeparatorLabel.snp.trailing).offset(10) + $0.trailing.equalTo(findButtonsLayoutGuide) + $0.centerY.equalTo(findButtonsLayoutGuide) + } + findButtonsLayoutGuide.snp.makeConstraints { + $0.centerX.bottom.equalTo(contentLayoutGuide) + $0.top.equalTo(registerButton.snp.bottom).offset(32) + $0.height.equalTo(22) + } + + copyrightLabel.snp.makeConstraints { + $0.bottom.centerX.equalTo(footerLayoutGuide) + $0.height.equalTo(12) + } + ownerButton.snp.makeConstraints { + $0.top.centerX.equalTo(footerLayoutGuide) + $0.bottom.equalTo(copyrightLabel.snp.top).offset(-21) + $0.height.equalTo(29) + } + + contentTopPaddingLayoutGuide.snp.makeConstraints { + $0.top.leading.trailing.equalToSuperview() + $0.height.equalTo(contentBottomPaddingLayoutGuide.snp.height).multipliedBy(2.0/3.0) + } + contentLayoutGuide.snp.makeConstraints { + $0.top.equalTo(contentTopPaddingLayoutGuide.snp.bottom) + $0.bottom.equalTo(contentBottomPaddingLayoutGuide.snp.top) + $0.leading.trailing.equalToSuperview() + } + contentBottomPaddingLayoutGuide.snp.makeConstraints { + $0.leading.trailing.equalToSuperview() + $0.bottom.equalTo(footerLayoutGuide.snp.top) + $0.height.greaterThanOrEqualTo(80) } - copyrightLabel.snp.makeConstraints { make in - make.bottom.equalTo(view.safeAreaLayoutGuide.snp.bottom).offset(-32) - make.centerX.equalToSuperview() - make.height.equalTo(18) + footerLayoutGuide.snp.makeConstraints { + $0.bottom.equalToSuperview().offset(0.5 < view.safeAreaInsets.bottom ? 0 : -32) + $0.leading.trailing.equalToSuperview() } } private func configureView() { setUpLayOuts() setUpConstraints() - self.view.backgroundColor = .systemBackground + view.backgroundColor = UIColor.appColor(.neutral0) } } From c96edf91cd04676d869fbcc859e308290935f32b Mon Sep 17 00:00:00 2001 From: GI JEONG HONG Date: Sun, 6 Sep 2026 22:34:00 +0900 Subject: [PATCH 2/5] =?UTF-8?q?deisng:=20=ED=9A=8C=EC=9B=90=EA=B0=80?= =?UTF-8?q?=EC=9E=85=20=EB=A6=AC=EB=94=94=EC=9E=90=EC=9D=B8=20UI=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Login/Login/LoginViewController.swift | 2 +- .../Register/RegisterFormViewModel.swift | 4 +- .../AgreementFormViewController.swift | 16 +++-- .../CertificationFormViewController.swift | 48 +++++++------ .../EnterFormViewController.swift | 57 +++++++++------- .../RegisterCompletionViewController.swift | 67 ++++++++++++++----- .../SelectTypeFormViewController.swift | 32 ++++++--- koin.xcodeproj/project.pbxproj | 2 +- 8 files changed, 149 insertions(+), 79 deletions(-) diff --git a/Koin/Presentation/Login/Login/LoginViewController.swift b/Koin/Presentation/Login/Login/LoginViewController.swift index f0288ed8..f42f6c9e 100644 --- a/Koin/Presentation/Login/Login/LoginViewController.swift +++ b/Koin/Presentation/Login/Login/LoginViewController.swift @@ -448,7 +448,7 @@ extension LoginViewController { copyrightLabel.snp.makeConstraints { $0.bottom.centerX.equalTo(footerLayoutGuide) - $0.height.equalTo(12) + $0.height.equalTo(18) } ownerButton.snp.makeConstraints { $0.top.centerX.equalTo(footerLayoutGuide) diff --git a/Koin/Presentation/Login/Register/RegisterFormViewModel.swift b/Koin/Presentation/Login/Register/RegisterFormViewModel.swift index de00b3d6..4e27ed98 100644 --- a/Koin/Presentation/Login/Register/RegisterFormViewModel.swift +++ b/Koin/Presentation/Login/Register/RegisterFormViewModel.swift @@ -106,7 +106,7 @@ extension RegisterFormViewModel { private func checkDuplicatedPhoneNumber(phone: String) { checkDuplicatedPhoneNumberUseCase.execute(phone: phone).sink { [weak self] completion in if case let .failure(error) = completion { - self?.outputSubject.send(.showHttpResult(error.message, .sub500)) + self?.outputSubject.send(.showHttpResult(error.message, .new600)) } } receiveValue: { [weak self] (_: Void) in self?.outputSubject.send(.changeSendVerificationButtonStatus) @@ -169,7 +169,7 @@ extension RegisterFormViewModel { private func checkDuplicatedNickname(nickname: String) { checkDuplicatedNicknameUseCase.execute(nickname: nickname).sink { [weak self] completion in if case let .failure(error) = completion { - self?.outputSubject.send(.showHttpResult(error.message, .danger700)) + self?.outputSubject.send(.showNicknameHttpResult(error.message, .new600)) } } receiveValue: { [weak self] _ in self?.outputSubject.send(.changeCheckButtonStatus) diff --git a/Koin/Presentation/Login/Register/ViewControllers/AgreementFormViewController.swift b/Koin/Presentation/Login/Register/ViewControllers/AgreementFormViewController.swift index 642741e5..6931d1c0 100644 --- a/Koin/Presentation/Login/Register/ViewControllers/AgreementFormViewController.swift +++ b/Koin/Presentation/Login/Register/ViewControllers/AgreementFormViewController.swift @@ -26,19 +26,19 @@ final class AgreementFormViewController: UIViewController { private let stepTextLabel = UILabel().then { $0.text = "1. 약관 동의" - $0.textColor = UIColor.appColor(.primary500) + $0.textColor = UIColor.appColor(.new500) $0.font = UIFont.appFont(.pretendardMedium, size: 16) } private let stepLabel = UILabel().then { $0.text = "1 / 4" - $0.textColor = UIColor.appColor(.primary500) + $0.textColor = UIColor.appColor(.new500) $0.font = UIFont.appFont(.pretendardMedium, size: 16) } private let progressView = UIProgressView().then { $0.trackTintColor = UIColor.appColor(.neutral200) - $0.progressTintColor = UIColor.appColor(.primary500) + $0.progressTintColor = UIColor.appColor(.new500) $0.layer.cornerRadius = 4 $0.clipsToBounds = true $0.progress = 0.25 @@ -65,7 +65,7 @@ final class AgreementFormViewController: UIViewController { config.image = resizedImage config.imagePlacement = .leading config.imagePadding = 8 - config.baseForegroundColor = UIColor.appColor(.primary500) + config.baseForegroundColor = UIColor.appColor(.new500) config.contentInsets = NSDirectionalEdgeInsets(top: 0, leading: 8, bottom: 0, trailing: 0) var attrTitle = AttributedString("모두 동의합니다.") @@ -79,7 +79,7 @@ final class AgreementFormViewController: UIViewController { $0.configurationUpdateHandler = { button in var updatedConfig = button.configuration - updatedConfig?.baseForegroundColor = UIColor.appColor(.primary500) + updatedConfig?.baseForegroundColor = UIColor.appColor(.new500) updatedConfig?.background.backgroundColor = UIColor.appColor(.neutral100) button.configuration = updatedConfig } @@ -150,12 +150,14 @@ extension AgreementFormViewController { let requiredChecked = agreementItems[0].checkButton.isSelected && agreementItems[1].checkButton.isSelected nextButton.isEnabled = requiredChecked - nextButton.backgroundColor = requiredChecked ? UIColor.appColor(.primary500) : UIColor.appColor(.neutral300) + nextButton.backgroundColor = requiredChecked ? UIColor.appColor(.new500) : UIColor.appColor(.neutral300) nextButton.setTitleColor(requiredChecked ? .white : UIColor.appColor(.neutral600), for: .normal) } private func updateCheckboxImage(checkbox: UIButton, isSelected: Bool) { - let original = isSelected ? UIImage.appImage(asset: .checkFilledCircle) : UIImage.appImage(asset: .checkEmptyCircle) + let original = isSelected + ? UIImage.appImage(asset: .checkFilledCircle)?.withTintColor(.appColor(.new500), renderingMode: .alwaysTemplate) + : UIImage.appImage(asset: .checkEmptyCircle) let resized = original?.resize(to: CGSize(width: 16, height: 16)) checkbox.setImage(resized, for: .normal) } diff --git a/Koin/Presentation/Login/Register/ViewControllers/CertificationFormViewController.swift b/Koin/Presentation/Login/Register/ViewControllers/CertificationFormViewController.swift index 684aaa85..c2ab46f4 100644 --- a/Koin/Presentation/Login/Register/ViewControllers/CertificationFormViewController.swift +++ b/Koin/Presentation/Login/Register/ViewControllers/CertificationFormViewController.swift @@ -27,19 +27,19 @@ final class CertificationFormViewController: UIViewController { private let stepTextLabel = UILabel().then { $0.text = "2. 본인 인증" - $0.textColor = UIColor.appColor(.primary500) + $0.textColor = UIColor.appColor(.new500) $0.font = UIFont.appFont(.pretendardMedium, size: 16) } private let stepLabel = UILabel().then { $0.text = "2 / 4" - $0.textColor = UIColor.appColor(.primary500) + $0.textColor = UIColor.appColor(.new500) $0.font = UIFont.appFont(.pretendardMedium, size: 16) } private let progressView = UIProgressView().then { $0.trackTintColor = UIColor.appColor(.neutral200) - $0.progressTintColor = UIColor.appColor(.primary500) + $0.progressTintColor = UIColor.appColor(.new500) $0.layer.cornerRadius = 4 $0.clipsToBounds = true $0.progress = 0.5 @@ -70,16 +70,16 @@ final class CertificationFormViewController: UIViewController { ) private let nameHelpLabel = UILabel().then { - $0.setImageText(image: .appImage(asset: .warningOrange), text: "올바른 양식이 아닙니다. 다시 입력해 주세요.", font: .appFont(.pretendardRegular, size: 12), textColor: .appColor(.sub500)) + $0.setImageText(image: .appImage(asset: .warningOrange)?.withTintColor(.appColor(.new600), renderingMode: .alwaysOriginal), text: "올바른 양식이 아닙니다. 다시 입력해 주세요.", font: .appFont(.pretendardRegular, size: 12), textColor: .appColor(.new600)) $0.isHidden = true } private let femaleButton = UIButton().then { - $0.applyRadioStyle(title: "여성", font: .appFont(.pretendardRegular, size: 16), image: .appImage(asset: .circlePrimary500), foregroundColor: .black) + $0.applyRadioStyle(title: "여성", font: .appFont(.pretendardRegular, size: 16), image: .appImage(asset: .circlePrimary500)?.withTintColor(.appColor(.new500), renderingMode: .alwaysOriginal), foregroundColor: .black) } private let maleButton = UIButton().then { - $0.applyRadioStyle(title: "남성", font: .appFont(.pretendardRegular, size: 16), image: .appImage(asset: .circlePrimary500), foregroundColor: .black) + $0.applyRadioStyle(title: "남성", font: .appFont(.pretendardRegular, size: 16), image: .appImage(asset: .circlePrimary500)?.withTintColor(.appColor(.new500), renderingMode: .alwaysOriginal), foregroundColor: .black) } private let phoneNumberLabel = UILabel().then { @@ -100,7 +100,7 @@ final class CertificationFormViewController: UIViewController { private let sendVerificationButton = StatefulButton( title: "인증번호 발송", font: .appFont(.pretendardRegular, size: 10), - enabledColor: .appColor(.primary500), + enabledColor: .appColor(.new500), disabledColor: .appColor(.neutral300), cornerRadius: 4 ).then { @@ -109,14 +109,14 @@ final class CertificationFormViewController: UIViewController { } private let phoneNumberReponseLabel = UILabel().then { - $0.setImageText(image: .appImage(asset: .warningOrange), text: "", font: .appFont(.pretendardRegular, size: 12), textColor: .appColor(.danger700)) + $0.setImageText(image: .appImage(asset: .warningOrange)?.withTintColor(.appColor(.new600), renderingMode: .alwaysOriginal), text: "", font: .appFont(.pretendardRegular, size: 12), textColor: .appColor(.new600)) $0.numberOfLines = 2 $0.isHidden = true } let goToLoginButton = UIButton().then { $0.setTitle("로그인 하기", for: .normal) - $0.setTitleColor(.appColor(.primary500), for: .normal) + $0.setTitleColor(.appColor(.new500), for: .normal) $0.titleLabel?.font = UIFont.appFont(.pretendardRegular, size: 12) $0.isHidden = true } @@ -130,7 +130,7 @@ final class CertificationFormViewController: UIViewController { private let contactButton = UIButton().then { $0.setTitle("문의하기", for: .normal) - $0.setTitleColor(.appColor(.primary500), for: .normal) + $0.setTitleColor(.appColor(.new500), for: .normal) $0.titleLabel?.font = UIFont.appFont(.pretendardRegular, size: 12) $0.isHidden = true } @@ -154,7 +154,7 @@ final class CertificationFormViewController: UIViewController { private let verificationButton = StatefulButton( title: "인증번호 확인", font: .appFont(.pretendardRegular, size: 10), - enabledColor: .appColor(.primary500), + enabledColor: .appColor(.new500), disabledColor: .appColor(.neutral300), cornerRadius: 4 ).then { @@ -163,7 +163,7 @@ final class CertificationFormViewController: UIViewController { } private let verificationHelpLabel = UILabel().then { - $0.setImageText(image: .appImage(asset: .warningOrange), text: "", font: .appFont(.pretendardRegular, size: 12), textColor: .appColor(.danger700)) + $0.setImageText(image: .appImage(asset: .warningOrange)?.withTintColor(.appColor(.new600), renderingMode: .alwaysOriginal), text: "", font: .appFont(.pretendardRegular, size: 12), textColor: .appColor(.new600)) $0.isHidden = true } @@ -238,7 +238,7 @@ final class CertificationFormViewController: UIViewController { self?.viewModel.tempPhoneNumber = self?.phoneNumberTextField.text self?.viewModel.tempGender = self?.femaleButton.configuration?.image == UIImage.appImage(asset: .circleCheckedPrimary500) ? "1" : "0" self?.nextButton.isEnabled = true - self?.nextButton.backgroundColor = UIColor.appColor(.primary500) + self?.nextButton.backgroundColor = UIColor.appColor(.new500) self?.nextButton.setTitleColor(.white, for: .normal) let customSessionId = CustomSessionManager.getOrCreateSessionId(duration: .fifteenMinutes, eventName: "sign_up", loginStatus: 0, platform: "iOS") self?.inputSubject.send(.logEventWithSessionId(EventParameter.EventLabel.User.identityVerification, .click, "인증완료", customSessionId)) @@ -342,8 +342,8 @@ extension CertificationFormViewController { var femaleConfig = femaleButton.configuration var maleConfig = maleButton.configuration - femaleConfig?.image = UIImage.appImage(asset: isFemale ? .circleCheckedPrimary500 : .circlePrimary500) - maleConfig?.image = UIImage.appImage(asset: isFemale ? .circlePrimary500 : .circleCheckedPrimary500) + femaleConfig?.image = UIImage.appImage(asset: isFemale ? .circleCheckedPrimary500 : .circlePrimary500)?.withTintColor(.appColor(.new500), renderingMode: .alwaysOriginal) + maleConfig?.image = UIImage.appImage(asset: isFemale ? .circlePrimary500 : .circleCheckedPrimary500)?.withTintColor(.appColor(.new500), renderingMode: .alwaysOriginal) femaleButton.configuration = femaleConfig maleButton.configuration = maleConfig @@ -352,7 +352,8 @@ extension CertificationFormViewController { private func updatePhoneNumberSectionVisibility() { let nameCount = nameTextField.text?.count ?? 0 let isNameValid = (2...5).contains(nameCount) - let isGenderSelected = (femaleButton.configuration?.image == UIImage.appImage(asset: .circleCheckedPrimary500)) || (maleButton.configuration?.image == UIImage.appImage(asset: .circleCheckedPrimary500)) + let isGenderSelected = (femaleButton.configuration?.image == UIImage.appImage(asset: .circleCheckedPrimary500)?.withTintColor(.appColor(.new500), renderingMode: .alwaysOriginal)) + || (maleButton.configuration?.image == UIImage.appImage(asset: .circleCheckedPrimary500)?.withTintColor(.appColor(.new500), renderingMode: .alwaysOriginal)) let shouldShowPhoneFields = isNameValid && isGenderSelected @@ -401,10 +402,10 @@ extension CertificationFormViewController { private func showVerificationHelpResult(_ message: String, _ color: ColorAsset) { verificationHelpLabel.isHidden = false verificationHelpLabel.setImageText( - image: UIImage.appImage(asset: .warningOrange), + image: UIImage.appImage(asset: .warningOrange)?.withTintColor(.appColor(.new600), renderingMode: .alwaysOriginal), text: message, font: UIFont.appFont(.pretendardRegular, size: 12), - textColor: UIColor.appColor(color) + textColor: UIColor.appColor(.new600) ) } @@ -419,13 +420,18 @@ extension CertificationFormViewController { private func showHttpResult(_ message: String, _ color: ColorAsset) { phoneNumberReponseLabel.isHidden = false - if message == "이미 존재하는 전화번호입니다." { + if message.contains("이미 존재") { phoneNumberReponseLabel.setImageText(image: .appImage(asset: .warningRed), text: message, font: .appFont(.pretendardRegular, size: 12), textColor: .appColor(.danger600)) [goToLoginButton, phoneNotFoundLabel, contactButton].forEach { $0.isHidden = false } + } else if message.contains("24시간 이후 재시도") { + phoneNumberReponseLabel.setImageText(image: .appImage(asset: .warningRed), text: message, font: .appFont(.pretendardRegular, size: 12), textColor: .appColor(.danger600)) + [goToLoginButton, phoneNotFoundLabel, contactButton].forEach { + $0.isHidden = true + } } else { - phoneNumberReponseLabel.setImageText(image: .appImage(asset: .warningOrange), text: message, font: .appFont(.pretendardRegular, size: 12), textColor: .appColor(color)) + phoneNumberReponseLabel.setImageText(image: .appImage(asset: .warningOrange)?.withTintColor(.appColor(.new600), renderingMode: .alwaysOriginal), text: message, font: .appFont(.pretendardRegular, size: 12), textColor: .appColor(.new600)) [goToLoginButton, phoneNotFoundLabel, contactButton].forEach { $0.isHidden = true } @@ -474,7 +480,7 @@ extension CertificationFormViewController { self.timer?.invalidate() self.timer = nil self.verificationHelpLabel.isHidden = false - self.verificationHelpLabel.setImageText(image: .appImage(asset: .warningOrange), text: "유효시간이 지났습니다. 인증번호를 재발송 해주세요.", font: .appFont(.pretendardRegular, size: 12), textColor: .appColor(.sub500)) + self.verificationHelpLabel.setImageText(image: .appImage(asset: .warningOrange)?.withTintColor(.appColor(.new600), renderingMode: .alwaysOriginal), text: "유효시간이 지났습니다. 인증번호를 재발송 해주세요.", font: .appFont(.pretendardRegular, size: 12), textColor: .appColor(.new600)) } } } diff --git a/Koin/Presentation/Login/Register/ViewControllers/EnterFormViewController.swift b/Koin/Presentation/Login/Register/ViewControllers/EnterFormViewController.swift index 9e652f3b..a58a8de4 100644 --- a/Koin/Presentation/Login/Register/ViewControllers/EnterFormViewController.swift +++ b/Koin/Presentation/Login/Register/ViewControllers/EnterFormViewController.swift @@ -25,19 +25,19 @@ final class EnterFormViewController: UIViewController { private let stepTextLabel = UILabel().then { $0.text = "4. 정보 입력" - $0.textColor = UIColor.appColor(.primary500) + $0.textColor = UIColor.appColor(.new500) $0.font = UIFont.appFont(.pretendardMedium, size: 16) } private let stepLabel = UILabel().then { $0.text = "4 / 4" - $0.textColor = UIColor.appColor(.primary500) + $0.textColor = UIColor.appColor(.new500) $0.font = UIFont.appFont(.pretendardMedium, size: 16) } private let progressView = UIProgressView().then { $0.trackTintColor = UIColor.appColor(.neutral200) - $0.progressTintColor = UIColor.appColor(.primary500) + $0.progressTintColor = UIColor.appColor(.new500) $0.layer.cornerRadius = 4 $0.clipsToBounds = true $0.progress = 1 @@ -65,12 +65,15 @@ final class EnterFormViewController: UIViewController { placeholder: "5~13자리로 입력해 주세요.", placeholderColor: UIColor.appColor(.neutral400), font: UIFont.appFont(.pretendardRegular, size: 14) - ) + ).then { + $0.autocorrectionType = .no + $0.textContentType = .oneTimeCode + } private let checkIdDuplicateButton = StatefulButton( title: "중복 확인", font: .appFont(.pretendardRegular, size: 10), - enabledColor: .appColor(.primary500), + enabledColor: .appColor(.new500), disabledColor: .appColor(.neutral300), cornerRadius: 4 ).then { @@ -99,10 +102,12 @@ final class EnterFormViewController: UIViewController { font: UIFont.appFont(.pretendardRegular, size: 13) ).then { $0.isSecureTextEntry = true + $0.autocorrectionType = .no + $0.textContentType = .oneTimeCode } private let passwordInfoLabel: UILabel = UILabel().then { - $0.setImageText(image: .appImage(asset: .warningOrange), text: "올바른 비밀번호 양식이 아닙니다. 다시 입력해 주세요.", font: .appFont(.pretendardRegular, size: 12), textColor: .appColor(.sub500)) + $0.setImageText(image: .appImage(asset: .warningOrange)?.withTintColor(.appColor(.new600), renderingMode: .alwaysOriginal), text: "올바른 비밀번호 양식이 아닙니다. 다시 입력해 주세요.", font: .appFont(.pretendardRegular, size: 12), textColor: .appColor(.new600)) $0.isHidden = true } @@ -112,6 +117,8 @@ final class EnterFormViewController: UIViewController { font: UIFont.appFont(.pretendardRegular, size: 13) ).then { $0.isSecureTextEntry = true + $0.autocorrectionType = .no + $0.textContentType = .oneTimeCode $0.isHidden = true } @@ -159,11 +166,12 @@ final class EnterFormViewController: UIViewController { placeholderColor: UIColor.appColor(.neutral400), font: UIFont.appFont(.pretendardRegular, size: 14) ).then { + $0.keyboardType = .numberPad $0.isHidden = true } private let studentIdWarningLabel = UILabel().then { - $0.setImageText(image: .appImage(asset: .warningOrange), text: "올바른 학번 양식이 아닙니다. 다시 입력해 주세요.", font: .appFont(.pretendardRegular, size: 12), textColor: .appColor(.sub500)) + $0.setImageText(image: .appImage(asset: .warningOrange)?.withTintColor(.appColor(.new600), renderingMode: .alwaysOriginal), text: "올바른 학번 양식이 아닙니다. 다시 입력해 주세요.", font: .appFont(.pretendardRegular, size: 12), textColor: .appColor(.new600)) $0.isHidden = true } @@ -178,7 +186,7 @@ final class EnterFormViewController: UIViewController { private let nicknameDuplicateButton = StatefulButton( title: "중복 확인", font: .appFont(.pretendardRegular, size: 10), - enabledColor: .appColor(.primary500), + enabledColor: .appColor(.new500), disabledColor: .appColor(.neutral300), cornerRadius: 4 ).then { @@ -187,7 +195,7 @@ final class EnterFormViewController: UIViewController { } private let nicknameResponseLabel = UILabel().then { - $0.setImageText(image: .appImage(asset: .warningOrange), text: "중복된 닉네임입니다. 다시 입력해 주세요.", font: .appFont(.pretendardRegular, size: 12), textColor: .appColor(.sub500)) + $0.setImageText(image: .appImage(asset: .warningOrange)?.withTintColor(.appColor(.new600), renderingMode: .alwaysOriginal), text: "이미 존재하는 닉네임입니다..", font: .appFont(.pretendardRegular, size: 12), textColor: .appColor(.new600)) $0.isHidden = true } @@ -215,7 +223,7 @@ final class EnterFormViewController: UIViewController { } private let generalEmailResponseLabel = UILabel().then { - $0.setImageText(image: .appImage(asset: .warningOrange), text: "올바른 이메일 형식이 아닙니다. 다시 입력해 주세요.", font: .appFont(.pretendardRegular, size: 12), textColor: .appColor(.sub500)) + $0.setImageText(image: .appImage(asset: .warningOrange)?.withTintColor(.appColor(.new600), renderingMode: .alwaysOriginal), text: "올바른 이메일 형식이 아닙니다. 다시 입력해 주세요.", font: .appFont(.pretendardRegular, size: 12), textColor: .appColor(.new600)) $0.isHidden = true } @@ -266,10 +274,10 @@ final class EnterFormViewController: UIViewController { guard !message.isEmpty else { return } self?.checkIdResponseLabel.isHidden = false self?.checkIdResponseLabel.setImageText( - image: UIImage.appImage(asset: .warningOrange), + image: UIImage.appImage(asset: .warningOrange)?.withTintColor(.appColor(.new600), renderingMode: .alwaysOriginal), text: message, font: UIFont.appFont(.pretendardRegular, size: 12), - textColor: .appColor(.sub500) + textColor: .appColor(.new600) ) case .successCheckDuplicatedId: self?.checkIdResponseLabel.isHidden = false @@ -285,13 +293,13 @@ final class EnterFormViewController: UIViewController { case let .showDeptDropDownList(deptList): self?.setUpDropDown(dropDown: strongSelf.deptDropDown, button: strongSelf.departmentDropdownButton, dataSource: deptList) case let .showNicknameHttpResult(message, color): - self?.nicknameResponseLabel.isHidden = false self?.nicknameResponseLabel.setImageText( - image: UIImage.appImage(asset: .warningOrange), + image: UIImage.appImage(asset: .warningOrange)?.withTintColor(.appColor(.new600), renderingMode: .alwaysOriginal), text: message, font: UIFont.appFont(.pretendardRegular, size: 12), - textColor: .appColor(.sub500) + textColor: .appColor(.new600) ) + self?.nicknameResponseLabel.isHidden = false case .changeCheckButtonStatus: self?.nicknameDuplicateButton.updateState(isEnabled: false) self?.nicknameResponseLabel.setImageText( @@ -399,10 +407,13 @@ extension EnterFormViewController { @objc private func keyboardWillShow(_ notification: Notification) { guard let userInfo = notification.userInfo, - let keyboardFrame = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect else { return } + let keyboardFrame = userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect else { + return + } + let bottomInset = keyboardFrame.height - (view.frame.height - nextButton.frame.minY) - scrollView.contentInset.bottom = keyboardFrame.height - scrollView.verticalScrollIndicatorInsets.bottom = keyboardFrame.height + scrollView.contentInset.bottom = bottomInset + scrollView.verticalScrollIndicatorInsets.bottom = bottomInset } @objc private func keyboardWillHide(_ notification: Notification) { @@ -509,7 +520,7 @@ extension EnterFormViewController { if isValid { nextButton.isEnabled = true - nextButton.backgroundColor = UIColor.appColor(.primary500) + nextButton.backgroundColor = UIColor.appColor(.new500) nextButton.setTitleColor(.white, for: .normal) } else { nextButton.isEnabled = false @@ -690,7 +701,7 @@ extension EnterFormViewController { } checkIdResponseLabel.snp.makeConstraints { - $0.top.equalTo(idTextField.snp.bottom).offset(8) + $0.top.equalTo(idTextField.snp.bottom) $0.leading.equalTo(idTextField.snp.leading).offset(4) $0.height.equalTo(20) } @@ -757,7 +768,7 @@ extension EnterFormViewController { } nicknameTextField.snp.makeConstraints { - $0.top.equalTo(studentIdTextField.snp.bottom).offset(8) + $0.top.equalTo(studentIdTextField.snp.bottom).offset(20) $0.leading.equalTo(departmentDropdownButton.snp.leading) $0.trailing.equalTo(nicknameDuplicateButton.snp.leading).offset(-16) $0.height.equalTo(40) @@ -777,7 +788,7 @@ extension EnterFormViewController { } studentEmailTextField.snp.makeConstraints { - $0.top.equalTo(nicknameTextField.snp.bottom).offset(8) + $0.top.equalTo(nicknameTextField.snp.bottom).offset(20) $0.leading.equalTo(departmentDropdownButton.snp.leading) $0.trailing.equalToSuperview().offset(-126) $0.height.equalTo(40) @@ -844,7 +855,7 @@ extension EnterFormViewController { setUpGeneralConstraints() nextButton.isEnabled = true - nextButton.backgroundColor = UIColor.appColor(.primary500) + nextButton.backgroundColor = UIColor.appColor(.new500) nextButton.setTitleColor(.white, for: .normal) } diff --git a/Koin/Presentation/Login/Register/ViewControllers/RegisterCompletionViewController.swift b/Koin/Presentation/Login/Register/ViewControllers/RegisterCompletionViewController.swift index a1d8f429..2ead5772 100644 --- a/Koin/Presentation/Login/Register/ViewControllers/RegisterCompletionViewController.swift +++ b/Koin/Presentation/Login/Register/ViewControllers/RegisterCompletionViewController.swift @@ -11,8 +11,18 @@ import SnapKit final class RegisterCompletionViewController: UIViewController { // MARK: - UI Components - private let koinLogoImageView = UIImageView().then { - $0.image = UIImage.appImage(asset: .koinLogo) + private let contentTopLayoutGuide = UILayoutGuide() + private let contentLayoutGuide = UILayoutGuide() + private let contentBottomLayoutGuide = UILayoutGuide() + + private let logoImageView = UIImageView().then { + $0.image = UIImage.appImage(asset: .bcsdSymbolLogo) + $0.contentMode = .scaleAspectFit + } + + private let logoTextImageView = UIImageView().then { + $0.image = UIImage.appImage(asset: .koinTextLogo) + $0.contentMode = .scaleAspectFit } private let registerCompletionLabel = UILabel().then { @@ -24,7 +34,7 @@ final class RegisterCompletionViewController: UIViewController { private let loginButton = UIButton().then { $0.setTitle("로그인 바로가기", for: .normal) $0.layer.cornerRadius = 8 - $0.backgroundColor = UIColor.appColor(.sub500) + $0.backgroundColor = .appColor(.new500) $0.setTitleColor(UIColor(.white), for: .normal) $0.titleLabel?.font = UIFont.appFont(.pretendardMedium, size: 16) } @@ -32,9 +42,11 @@ final class RegisterCompletionViewController: UIViewController { private let homeButton = UIButton().then { $0.setTitle("홈화면 바로가기", for: .normal) $0.layer.cornerRadius = 8 - $0.backgroundColor = UIColor.appColor(.primary500) - $0.setTitleColor(UIColor(.white), for: .normal) + $0.backgroundColor = .appColor(.neutral0) + $0.setTitleColor(.appColor(.new500), for: .normal) $0.titleLabel?.font = UIFont.appFont(.pretendardMedium, size: 16) + $0.layer.borderColor = UIColor.appColor(.new500).cgColor + $0.layer.borderWidth = 1 } // MARK: - Life Cycle @@ -71,36 +83,61 @@ extension RegisterCompletionViewController { extension RegisterCompletionViewController { private func setUpLayout() { - [koinLogoImageView, registerCompletionLabel, loginButton, homeButton].forEach { + [logoImageView, logoTextImageView, registerCompletionLabel, loginButton, homeButton].forEach { view.addSubview($0) } + + [contentTopLayoutGuide, contentLayoutGuide, contentBottomLayoutGuide].forEach { + view.addLayoutGuide($0) + } } private func setUpConstraints() { - koinLogoImageView.snp.makeConstraints { - $0.bottom.equalTo(registerCompletionLabel.snp.top).offset(-24) - $0.centerX.equalToSuperview() - $0.height.greaterThanOrEqualTo(56) - $0.width.greaterThanOrEqualTo(96) + logoImageView.snp.makeConstraints { + $0.top.centerX.equalTo(contentLayoutGuide) + $0.height.equalTo(66) + } + + logoTextImageView.snp.makeConstraints { + $0.top.equalTo(logoImageView.snp.bottom).offset(9) + $0.centerX.equalTo(contentLayoutGuide) + $0.width.equalTo(102) + $0.height.equalTo(41) } registerCompletionLabel.snp.makeConstraints { + $0.top.equalTo(logoTextImageView.snp.bottom).offset(24) $0.bottom.equalTo(loginButton.snp.top).offset(-56) - $0.centerX.equalToSuperview() + $0.centerX.equalTo(contentLayoutGuide) $0.height.equalTo(29) } loginButton.snp.makeConstraints { - $0.centerY.equalToSuperview() - $0.horizontalEdges.equalToSuperview().inset(24) + $0.horizontalEdges.equalTo(contentLayoutGuide).inset(48) $0.height.equalTo(48) } homeButton.snp.makeConstraints { $0.top.equalTo(loginButton.snp.bottom).offset(24) - $0.horizontalEdges.equalToSuperview().inset(24) + $0.horizontalEdges.equalTo(contentLayoutGuide).inset(48) + $0.bottom.equalTo(contentLayoutGuide) $0.height.equalTo(48) } + + contentTopLayoutGuide.snp.makeConstraints { + $0.top.leading.trailing.equalTo(view.safeAreaLayoutGuide) + $0.bottom.equalTo(contentLayoutGuide.snp.top) + $0.height.equalTo(contentBottomLayoutGuide.snp.height).multipliedBy(2.0/3.0) + } + + contentLayoutGuide.snp.makeConstraints { + $0.leading.trailing.equalTo(view.safeAreaLayoutGuide) + $0.bottom.equalTo(contentBottomLayoutGuide.snp.top) + } + + contentBottomLayoutGuide.snp.makeConstraints { + $0.leading.trailing.bottom.equalTo(view.safeAreaLayoutGuide) + } } private func configureView() { diff --git a/Koin/Presentation/Login/Register/ViewControllers/SelectTypeFormViewController.swift b/Koin/Presentation/Login/Register/ViewControllers/SelectTypeFormViewController.swift index 196fd36f..ee4b2933 100644 --- a/Koin/Presentation/Login/Register/ViewControllers/SelectTypeFormViewController.swift +++ b/Koin/Presentation/Login/Register/ViewControllers/SelectTypeFormViewController.swift @@ -47,11 +47,17 @@ final class SelectTypeFormViewController: UIViewController { } private let logoImageView = UIImageView().then { - $0.image = UIImage.appImage(asset: .koinLogo) + $0.image = UIImage.appImage(asset: .bcsdSymbolLogo) + $0.contentMode = .scaleAspectFit + } + + private let logoTextImageView = UIImageView().then { + $0.image = UIImage.appImage(asset: .koinTextLogo) + $0.contentMode = .scaleAspectFit } private let studentButton = UIButton().then { - $0.backgroundColor = .appColor(.sub500) + $0.backgroundColor = .appColor(.new500) $0.setTitle("한국기술교육대학교 학생", for: .normal) $0.setTitleColor(.white, for: .normal) $0.titleLabel?.font = UIFont.appFont(.pretendardMedium, size: 16) @@ -59,11 +65,13 @@ final class SelectTypeFormViewController: UIViewController { } private let generalButton = UIButton().then { - $0.backgroundColor = .appColor(.primary500) + $0.backgroundColor = .appColor(.neutral0) $0.setTitle("외부인", for: .normal) - $0.setTitleColor(.white, for: .normal) + $0.setTitleColor(.appColor(.new500), for: .normal) $0.titleLabel?.font = UIFont.appFont(.pretendardMedium, size: 16) $0.layer.cornerRadius = 8 + $0.layer.borderColor = UIColor.appColor(.new500).cgColor + $0.layer.borderWidth = 1 } // MARK: - Init @@ -133,7 +141,7 @@ extension SelectTypeFormViewController { // MARK: UI Settings extension SelectTypeFormViewController { private func setUpLayouts() { - [stepTextLabel, stepLabel, progressView, logoImageView, studentButton, generalButton].forEach { + [stepTextLabel, stepLabel, progressView, logoImageView, logoTextImageView, studentButton, generalButton].forEach { view.addSubview($0) } } @@ -156,14 +164,20 @@ extension SelectTypeFormViewController { } logoImageView.snp.makeConstraints { - $0.top.equalTo(progressView.snp.bottom).offset(100) + $0.top.equalTo(progressView.snp.bottom).offset(52) + $0.centerX.equalToSuperview() + $0.height.equalTo(66) + } + + logoTextImageView.snp.makeConstraints { + $0.top.equalTo(logoImageView.snp.bottom).offset(9) $0.centerX.equalToSuperview() - $0.width.greaterThanOrEqualTo(96) - $0.height.greaterThanOrEqualTo(56) + $0.width.equalTo(102) + $0.height.equalTo(41) } studentButton.snp.makeConstraints { - $0.top.equalTo(logoImageView.snp.bottom).offset(80) + $0.top.equalTo(logoTextImageView.snp.bottom).offset(52) $0.leading.equalToSuperview().offset(48) $0.trailing.equalToSuperview().offset(-48) $0.height.equalTo(48) diff --git a/koin.xcodeproj/project.pbxproj b/koin.xcodeproj/project.pbxproj index c01a4cdd..06ca8366 100644 --- a/koin.xcodeproj/project.pbxproj +++ b/koin.xcodeproj/project.pbxproj @@ -3598,9 +3598,9 @@ children = ( 7CED8F262EF2D1F900457128 /* AgreementFormViewController.swift */, 7CED8F272EF2D1F900457128 /* CertificationFormViewController.swift */, + 7CED8F2B2EF2D1F900457128 /* SelectTypeFormViewController.swift */, 7CED8F282EF2D1F900457128 /* EnterFormViewController.swift */, 7CED8F292EF2D1F900457128 /* RegisterCompletionViewController.swift */, - 7CED8F2B2EF2D1F900457128 /* SelectTypeFormViewController.swift */, ); path = ViewControllers; sourceTree = ""; From 324616c7ee599c51039d3db214618370007dbb84 Mon Sep 17 00:00:00 2001 From: GI JEONG HONG Date: Sun, 6 Sep 2026 23:47:31 +0900 Subject: [PATCH 3/5] =?UTF-8?q?design:=20=EC=95=84=EC=9D=B4=EB=94=94=20?= =?UTF-8?q?=EC=B0=BE=EA=B8=B0=20UI=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Login/FindId/StateButton.swift | 4 ++-- Koin/Presentation/Login/FindId/StateView.swift | 8 ++++---- .../FindPhoneIdViewController.swift | 18 +++++++++++++----- .../FoundIdViewController.swift | 14 ++++++++------ 4 files changed, 27 insertions(+), 17 deletions(-) diff --git a/Koin/Presentation/Login/FindId/StateButton.swift b/Koin/Presentation/Login/FindId/StateButton.swift index e129bfcb..929c0b9a 100644 --- a/Koin/Presentation/Login/FindId/StateButton.swift +++ b/Koin/Presentation/Login/FindId/StateButton.swift @@ -31,11 +31,11 @@ final class StateButton: UIButton { self.setTitleColor(UIColor.appColor(.neutral600), for: .normal) self.isEnabled = false case .usable: - self.backgroundColor = UIColor.appColor(.primary500) + self.backgroundColor = UIColor.appColor(.new500) self.setTitleColor(.white, for: .normal) self.isEnabled = true case .retry: - self.backgroundColor = UIColor.appColor(.sub500) + self.backgroundColor = UIColor.appColor(.new600) self.setTitleColor(.white, for: .normal) self.isEnabled = false } diff --git a/Koin/Presentation/Login/FindId/StateView.swift b/Koin/Presentation/Login/FindId/StateView.swift index e7b71c03..d9348b05 100644 --- a/Koin/Presentation/Login/FindId/StateView.swift +++ b/Koin/Presentation/Login/FindId/StateView.swift @@ -37,13 +37,13 @@ final class StateView: UIView { messageLabel.text = message switch state { case .success: - imageView.image = UIImage(named: "successCircle") + imageView.image = UIImage.appImage(asset: .successCircle) messageLabel.textColor = UIColor.appColor(.success700) case .warning: - imageView.image = UIImage(named: "warningOrange") - messageLabel.textColor = UIColor.appColor(.sub500) + imageView.image = UIImage.appImage(asset: .warningOrange)?.withTintColor(.appColor(.new600)) + messageLabel.textColor = UIColor.appColor(.new600) case .dangerous: - imageView.image = UIImage(named: "warningRed") + imageView.image = UIImage.appImage(asset: .warningRed) messageLabel.textColor = UIColor.appColor(.danger700) } } diff --git a/Koin/Presentation/Login/FindId/ViewControllers/FindPhoneIdViewController.swift b/Koin/Presentation/Login/FindId/ViewControllers/FindPhoneIdViewController.swift index 7f87f2cd..d81ac380 100644 --- a/Koin/Presentation/Login/FindId/ViewControllers/FindPhoneIdViewController.swift +++ b/Koin/Presentation/Login/FindId/ViewControllers/FindPhoneIdViewController.swift @@ -28,7 +28,9 @@ final class FindPhoneIdViewController: UIViewController { $0.text = certType == .phone ? "휴대전화 번호" : "이메일" } - private lazy var phoneNumberTextField = DefaultTextField(placeholder: certType == .phone ? "- 없이 번호를 입력해 주세요." : "등록된 이메일을 입력해 주세요.", placeholderColor: UIColor.appColor(.neutral400), font: UIFont.appFont(.pretendardRegular, size: 14)) + private lazy var phoneNumberTextField = DefaultTextField(placeholder: certType == .phone ? "- 없이 번호를 입력해 주세요." : "등록된 이메일을 입력해 주세요.", placeholderColor: UIColor.appColor(.neutral400), font: UIFont.appFont(.pretendardRegular, size: 14)).then { + $0.keyboardType = .numberPad + } private let sendButton = StateButton().then { $0.setState(state: .unusable) @@ -41,7 +43,7 @@ final class FindPhoneIdViewController: UIViewController { private let changeButton = UIButton().then { $0.setTitle("이메일로 찾기", for: .normal) - $0.setTitleColor(UIColor.appColor(.primary500), for: .normal) + $0.setTitleColor(UIColor.appColor(.new500), for: .normal) $0.titleLabel?.font = UIFont.appFont(.pretendardMedium, size: 12) } @@ -73,6 +75,8 @@ final class FindPhoneIdViewController: UIViewController { private let saveButton = StateButton(font: UIFont.appFont(.pretendardMedium, size: 16)).then { $0.setState(state: .unusable) $0.setTitle("저장", for: .normal) + }.then { + $0.layer.cornerRadius = 8 } init(viewModel: FindIdViewModel, certType: CertType = .phone) { @@ -172,6 +176,10 @@ extension FindPhoneIdViewController { } } @objc private func sendButtonTapped() { + [helpLabel, changeButton].forEach { + $0.isHidden = true + } + if certType == .phone { viewModel.sendVerificationCode(phoneNumber: phoneNumberTextField.text ?? "") } else { @@ -242,15 +250,15 @@ extension FindPhoneIdViewController { phoneStateView.snp.makeConstraints { $0.top.equalTo(phoneNumberTextField.snp.bottom).offset(5) $0.leading.equalTo(phoneNumberTextField) - $0.height.equalTo(19) } helpLabel.snp.makeConstraints { - $0.top.equalTo(phoneStateView.snp.bottom).offset(5) + $0.top.equalTo(phoneNumberTextField.snp.bottom).offset(5) $0.leading.equalTo(phoneNumberLabel) + $0.height.equalTo(19) } changeButton.snp.makeConstraints { $0.leading.equalTo(helpLabel.snp.trailing).offset(5) - $0.top.bottom.equalTo(helpLabel) + $0.centerY.equalTo(helpLabel) $0.width.equalTo(66) $0.height.equalTo(19) } diff --git a/Koin/Presentation/Login/FindId/ViewControllers/FoundIdViewController.swift b/Koin/Presentation/Login/FindId/ViewControllers/FoundIdViewController.swift index 641fc2e6..0412df99 100644 --- a/Koin/Presentation/Login/FindId/ViewControllers/FoundIdViewController.swift +++ b/Koin/Presentation/Login/FindId/ViewControllers/FoundIdViewController.swift @@ -23,18 +23,20 @@ final class FoundIdViewController: UIViewController { private let subMessageLabel = UILabel() private let loginButton = UIButton().then { - $0.backgroundColor = UIColor.appColor(.sub500) + $0.backgroundColor = UIColor.appColor(.new500) $0.setTitle("로그인 바로가기", for: .normal) $0.setTitleColor(UIColor.appColor(.neutral0), for: .normal) - $0.titleLabel?.font = UIFont.appFont(.pretendardRegular, size: 15) + $0.titleLabel?.font = UIFont.appFont(.pretendardMedium, size: 16) $0.layer.cornerRadius = 8 } private let findPasswordButton = UIButton().then { - $0.backgroundColor = UIColor.appColor(.primary500) + $0.backgroundColor = UIColor.appColor(.neutral0) $0.setTitle("비밀번호 찾기", for: .normal) - $0.setTitleColor(UIColor.appColor(.neutral0), for: .normal) - $0.titleLabel?.font = UIFont.appFont(.pretendardRegular, size: 15) + $0.setTitleColor(UIColor.appColor(.new500), for: .normal) + $0.titleLabel?.font = UIFont.appFont(.pretendardMedium, size: 16) + $0.layer.borderColor = UIColor.appColor(.new500).cgColor + $0.layer.borderWidth = 1 $0.layer.cornerRadius = 8 } @@ -260,7 +262,7 @@ extension FoundIdViewController { private func setupComponents() { messageLabel.font = UIFont.appFont(.pretendardBold, size: 24) - messageLabel.textColor = UIColor.appColor(.primary500) + messageLabel.textColor = UIColor.appColor(.new500) } private func setupUI() { From 6407a77a06abb26a1fab831dcd9dbaef3eafc49b Mon Sep 17 00:00:00 2001 From: GI JEONG HONG Date: Mon, 7 Sep 2026 00:14:51 +0900 Subject: [PATCH 4/5] =?UTF-8?q?design:=20=EB=B9=84=EB=B0=80=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EC=B0=BE=EA=B8=B0=20UI=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ChangePasswordSuccessViewController.swift | 6 ++++-- .../FindPasswordCertViewController.swift | 15 +++++++++------ .../FindPasswordChangeViewController.swift | 8 +++++--- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/Koin/Presentation/Login/FindPassword/ChangePasswordSuccessViewController.swift b/Koin/Presentation/Login/FindPassword/ChangePasswordSuccessViewController.swift index 32599802..b5a19637 100644 --- a/Koin/Presentation/Login/FindPassword/ChangePasswordSuccessViewController.swift +++ b/Koin/Presentation/Login/FindPassword/ChangePasswordSuccessViewController.swift @@ -15,7 +15,7 @@ final class ChangePasswordSuccessViewController: UIViewController { // MARK: - UI Components private let circleImageView = UIImageView().then { - $0.image = UIImage(named: "checkFilledCircle") + $0.image = .appImage(asset: .checkEmptyCircle)?.withTintColor(.appColor(.new600)) } private let messageLabel = UILabel().then { @@ -29,6 +29,8 @@ final class ChangePasswordSuccessViewController: UIViewController { private let goLoginButton = StateButton(font: UIFont.appFont(.pretendardBold, size: 15)).then { $0.setState(state: .usable) $0.setTitle("로그인 화면 바로가기", for: .normal) + }.then { + $0.layer.cornerRadius = 8 } init() { @@ -232,7 +234,7 @@ extension ChangePasswordSuccessViewController { private func setupComponents() { messageLabel.font = UIFont.appFont(.pretendardBold, size: 24) - messageLabel.textColor = UIColor.appColor(.primary500) + messageLabel.textColor = UIColor.appColor(.new500) subMessageLabel.font = UIFont.appFont(.pretendardMedium, size: 16) subMessageLabel.textColor = UIColor.appColor(.gray) } diff --git a/Koin/Presentation/Login/FindPassword/FindPasswordCertViewController.swift b/Koin/Presentation/Login/FindPassword/FindPasswordCertViewController.swift index de9a1d46..8a080609 100644 --- a/Koin/Presentation/Login/FindPassword/FindPasswordCertViewController.swift +++ b/Koin/Presentation/Login/FindPassword/FindPasswordCertViewController.swift @@ -25,19 +25,19 @@ final class FindPasswordCertViewController: UIViewController { private let stepTextLabel = UILabel().then { $0.text = "1. 계정 인증" - $0.textColor = UIColor.appColor(.primary500) + $0.textColor = UIColor.appColor(.new500) $0.font = UIFont.appFont(.pretendardMedium, size: 16) } private let stepLabel = UILabel().then { $0.text = "1 / 2" - $0.textColor = UIColor.appColor(.primary500) + $0.textColor = UIColor.appColor(.new500) $0.font = UIFont.appFont(.pretendardMedium, size: 16) } private let progressView = UIProgressView().then { $0.trackTintColor = UIColor.appColor(.neutral200) - $0.progressTintColor = UIColor.appColor(.primary500) + $0.progressTintColor = UIColor.appColor(.new500) $0.layer.cornerRadius = 4 $0.clipsToBounds = true $0.progress = 0.5 @@ -195,6 +195,9 @@ extension FindPasswordCertViewController { } } @objc private func sendButtonTapped() { + [helpLabel, changeButton].forEach { + $0.isHidden = true + } switch certType { case .phone: viewModel.sendVerificationCode() case .email: viewModel.sendVerificationEmail() @@ -283,7 +286,7 @@ extension FindPasswordCertViewController { $0.height.equalTo(32) } helpLabel.snp.makeConstraints { - $0.top.equalTo(phoneTextField.snp.bottom).offset(3) + $0.top.equalTo(phoneTextField.snp.bottom).offset(8) $0.leading.equalTo(phoneTextField) } changeButton.snp.makeConstraints { @@ -293,7 +296,7 @@ extension FindPasswordCertViewController { $0.height.equalTo(19) } phoneStateView.snp.makeConstraints { - $0.top.equalTo(helpLabel.snp.bottom).offset(4) + $0.top.equalTo(phoneTextField.snp.bottom).offset(8) $0.leading.equalTo(stepTextLabel) $0.height.equalTo(19) } @@ -336,7 +339,7 @@ extension FindPasswordCertViewController { helpLabel.font = UIFont.appFont(.pretendardRegular, size: 12) helpLabel.textColor = UIColor.appColor(.neutral500) changeButton.titleLabel?.font = UIFont.appFont(.pretendardRegular, size: 12) - changeButton.setTitleColor(UIColor.appColor(.primary500), for: .normal) + changeButton.setTitleColor(UIColor.appColor(.new500), for: .normal) } private func setUpTextFieldUnderline() { [idtextField, phoneTextField, certNumberTextField].forEach { diff --git a/Koin/Presentation/Login/FindPassword/FindPasswordChangeViewController.swift b/Koin/Presentation/Login/FindPassword/FindPasswordChangeViewController.swift index 415c780d..c5d233d4 100644 --- a/Koin/Presentation/Login/FindPassword/FindPasswordChangeViewController.swift +++ b/Koin/Presentation/Login/FindPassword/FindPasswordChangeViewController.swift @@ -19,19 +19,19 @@ final class FindPasswordChangeViewController: UIViewController { private let stepTextLabel = UILabel().then { $0.text = "2. 비밀번호 변경" - $0.textColor = UIColor.appColor(.primary500) + $0.textColor = UIColor.appColor(.new500) $0.font = UIFont.appFont(.pretendardMedium, size: 16) } private let stepLabel = UILabel().then { $0.text = "2 / 2" - $0.textColor = UIColor.appColor(.primary500) + $0.textColor = UIColor.appColor(.new500) $0.font = UIFont.appFont(.pretendardMedium, size: 16) } private let progressView = UIProgressView().then { $0.trackTintColor = UIColor.appColor(.neutral200) - $0.progressTintColor = UIColor.appColor(.primary500) + $0.progressTintColor = UIColor.appColor(.new500) $0.layer.cornerRadius = 4 $0.clipsToBounds = true $0.progress = 1 @@ -68,6 +68,8 @@ final class FindPasswordChangeViewController: UIViewController { private let nextButton = StateButton(font: UIFont.appFont(.pretendardMedium, size: 15)).then { $0.setTitle("다음", for: .normal) $0.setState(state: .unusable) + }.then { + $0.layer.cornerRadius = 8 } init(viewModel: FindPasswordViewModel, certType: FindPasswordCertViewController.CertType) { From 85b3d1c10e7f585a7ae3d03fc44b8a42fa5f2b17 Mon Sep 17 00:00:00 2001 From: GI JEONG HONG Date: Mon, 7 Sep 2026 01:14:27 +0900 Subject: [PATCH 5/5] =?UTF-8?q?design:=20=EC=84=A4=EC=A0=95=20UI=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ChangeMyProfileViewController.swift | 11 ++++--- .../ChangePasswordViewController.swift | 23 ++++++++----- .../SubViews/CertificationView.swift | 4 +-- .../SubViews/ChangePasswordView.swift | 6 ++-- .../Setting/Noti/NotiViewController.swift | 33 +++++++------------ .../Setting/Policy/PolicyViewController.swift | 2 +- .../Settings/SettingsViewController.swift | 2 +- 7 files changed, 39 insertions(+), 42 deletions(-) diff --git a/Koin/Presentation/Setting/ChangeMyProfile/ChangeMyProfileViewController.swift b/Koin/Presentation/Setting/ChangeMyProfile/ChangeMyProfileViewController.swift index 5a9f0478..8be40d54 100644 --- a/Koin/Presentation/Setting/ChangeMyProfile/ChangeMyProfileViewController.swift +++ b/Koin/Presentation/Setting/ChangeMyProfile/ChangeMyProfileViewController.swift @@ -172,8 +172,8 @@ final class ChangeMyProfileViewController: UIViewController { var updatedConfig = button.configuration ?? UIButton.Configuration.plain() let isSelected = button.isSelected updatedConfig.image = isSelected - ? UIImage(named: "circleCheckedPrimary500") - : UIImage(named: "circlePrimary500") + ? UIImage.appImage(asset: .circleCheckedPrimary500)?.withTintColor(.appColor(.new500)) + : UIImage.appImage(asset: .circlePrimary500)?.withTintColor(.appColor(.new500)) var text = AttributedString("남성") text.font = UIFont.appFont(.pretendardRegular, size: 12) updatedConfig.attributedTitle = text @@ -196,8 +196,8 @@ final class ChangeMyProfileViewController: UIViewController { var updatedConfig = button.configuration ?? UIButton.Configuration.plain() let isSelected = button.isSelected updatedConfig.image = isSelected - ? UIImage(named: "circleCheckedPrimary500") - : UIImage(named: "circlePrimary500") + ? UIImage.appImage(asset: .circleCheckedPrimary500)?.withTintColor(.appColor(.new500)) + : UIImage.appImage(asset: .circlePrimary500)?.withTintColor(.appColor(.new500)) var text = AttributedString("여성") text.font = UIFont.appFont(.pretendardRegular, size: 12) updatedConfig.attributedTitle = text @@ -209,6 +209,7 @@ final class ChangeMyProfileViewController: UIViewController { private let saveButton = StateButton(font: UIFont.appFont(.pretendardMedium, size: 15)).then { $0.setTitle("저장", for: .normal) $0.setState(state: .unusable) + $0.layer.cornerRadius = 8 } // MARK: - Initialization @@ -713,7 +714,7 @@ extension ChangeMyProfileViewController { helpLabel.font = UIFont.appFont(.pretendardRegular, size: 12) helpLabel.textColor = UIColor.appColor(.neutral500) inquryButton.titleLabel?.font = UIFont.appFont(.pretendardRegular, size: 12) - inquryButton.setTitleColor(UIColor.appColor(.primary500), for: .normal) + inquryButton.setTitleColor(UIColor.appColor(.new500), for: .normal) emailTextLabel.font = UIFont.appFont(.pretendardRegular, size: 14) emailTextLabel.textColor = .black } diff --git a/Koin/Presentation/Setting/ChangePassword/ChangePasswordViewController.swift b/Koin/Presentation/Setting/ChangePassword/ChangePasswordViewController.swift index e086c7d4..8739243d 100644 --- a/Koin/Presentation/Setting/ChangePassword/ChangePasswordViewController.swift +++ b/Koin/Presentation/Setting/ChangePassword/ChangePasswordViewController.swift @@ -21,18 +21,18 @@ final class ChangePasswordViewController: UIViewController { private let progressTitleLabel = UILabel().then { $0.text = "1. 계정 인증" $0.font = UIFont.appFont(.pretendardMedium, size: 16) - $0.textColor = UIColor.appColor(.primary500) + $0.textColor = UIColor.appColor(.new500) } private let progressStepLabel = UILabel().then { $0.text = "1 / 2" $0.font = UIFont.appFont(.pretendardMedium, size: 16) - $0.textColor = UIColor.appColor(.primary500) + $0.textColor = UIColor.appColor(.new500) } private let progressView = UIProgressView().then { $0.trackTintColor = UIColor.appColor(.neutral300) - $0.progressTintColor = UIColor.appColor(.primary500) + $0.progressTintColor = UIColor.appColor(.new500) $0.layer.cornerRadius = 4 $0.clipsToBounds = true $0.progress = 0.5 @@ -47,6 +47,7 @@ final class ChangePasswordViewController: UIViewController { button.backgroundColor = UIColor.appColor(.neutral300) button.setTitleColor(UIColor.appColor(.neutral600), for: .normal) button.titleLabel?.font = UIFont.appFont(.pretendardMedium, size: 15) + button.layer.cornerRadius = 8 } private let certificationView = CertificationView(frame: .zero).then { view in @@ -85,7 +86,7 @@ final class ChangePasswordViewController: UIViewController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - configureNavigationBar(style: .fill) + configureNavigationBar(style: .empty) } @@ -97,7 +98,12 @@ final class ChangePasswordViewController: UIViewController { outputSubject.receive(on: DispatchQueue.main).sink { [weak self] output in switch output { case let .showToast(message, success, dismiss): - self?.showToast(message: message, success: success) + self?.showToastMessage(config: .init( + intent: success ? .neutral : .negative, + variant: .standard, + message: message, + bottomInset: 68 + )) if dismiss { self?.navigationController?.popViewController(animated: true) } @@ -126,7 +132,7 @@ final class ChangePasswordViewController: UIViewController { extension ChangePasswordViewController { private func changeButtonEnable(isEnable: Bool) { - completeButton.backgroundColor = isEnable ? UIColor.appColor(.primary500) : UIColor.appColor(.neutral300) + completeButton.backgroundColor = isEnable ? UIColor.appColor(.new500) : UIColor.appColor(.neutral300) completeButton.setTitleColor(isEnable ? UIColor.appColor(.neutral0) : UIColor.appColor(.neutral600), for: .normal) completeButton.isEnabled = isEnable ? true : false } @@ -194,9 +200,8 @@ extension ChangePasswordViewController { make.height.equalTo(300) } completeButton.snp.makeConstraints { make in - make.bottom.equalTo(view.snp.bottom).offset(-24) - make.leading.equalTo(view.snp.leading).offset(24) - make.trailing.equalTo(view.snp.trailing).offset(-24) + make.bottom.equalTo(view.safeAreaLayoutGuide.snp.bottom).offset(-10) + make.leading.trailing.equalToSuperview().inset(24) make.height.equalTo(48) } } diff --git a/Koin/Presentation/Setting/ChangePassword/SubViews/CertificationView.swift b/Koin/Presentation/Setting/ChangePassword/SubViews/CertificationView.swift index 93e01996..a38db9a7 100644 --- a/Koin/Presentation/Setting/ChangePassword/SubViews/CertificationView.swift +++ b/Koin/Presentation/Setting/ChangePassword/SubViews/CertificationView.swift @@ -57,7 +57,7 @@ final class CertificationView: UIView { } private let errorResponseLabel = UILabel().then { - $0.textColor = UIColor.appColor(.sub500) + $0.textColor = UIColor.appColor(.new600) $0.font = UIFont.appFont(.pretendardRegular, size: 12) } @@ -83,7 +83,7 @@ final class CertificationView: UIView { } func showErrorMessage(message: String) { - passwordTextField.layer.borderColor = UIColor.appColor(.sub500).cgColor + passwordTextField.layer.borderColor = UIColor.appColor(.new600).cgColor passwordTextField.layer.borderWidth = 1.0 errorResponseLabel.text = "⚠ \(message)" } diff --git a/Koin/Presentation/Setting/ChangePassword/SubViews/ChangePasswordView.swift b/Koin/Presentation/Setting/ChangePassword/SubViews/ChangePasswordView.swift index b404e616..f8c7a086 100644 --- a/Koin/Presentation/Setting/ChangePassword/SubViews/ChangePasswordView.swift +++ b/Koin/Presentation/Setting/ChangePassword/SubViews/ChangePasswordView.swift @@ -22,6 +22,7 @@ final class ChangePasswordView: UIView { let passwordTextField = UITextField().then { textField in textField.placeholder = "새 비밀번호를 입력해주세요." textField.isSecureTextEntry = true + textField.rightViewMode = .never } private let englishStackView = UIStackView().then { stackView in @@ -44,8 +45,9 @@ final class ChangePasswordView: UIView { let passwordCheckTextField = UITextField().then { textField in textField.placeholder = "새 비밀번호를 다시 입력해주세요." - textField.layer.borderColor = UIColor.appColor(.sub500).cgColor + textField.layer.borderColor = UIColor.appColor(.new600).cgColor textField.isSecureTextEntry = true + textField.rightViewMode = .never } private let changeSecureButton1 = UIButton().then { button in @@ -57,7 +59,7 @@ final class ChangePasswordView: UIView { } private let errorResponseLabel = UILabel().then { - $0.textColor = UIColor.appColor(.sub500) + $0.textColor = UIColor.appColor(.new600) $0.font = UIFont.appFont(.pretendardRegular, size: 12) } diff --git a/Koin/Presentation/Setting/Noti/NotiViewController.swift b/Koin/Presentation/Setting/Noti/NotiViewController.swift index 7bee9bd1..b6f633b0 100644 --- a/Koin/Presentation/Setting/Noti/NotiViewController.swift +++ b/Koin/Presentation/Setting/Noti/NotiViewController.swift @@ -81,7 +81,7 @@ final class NotiViewController: UIViewController { private let soldOutSwitch: UISwitch = { let uiSwitch = UISwitch() - uiSwitch.onTintColor = UIColor.appColor(.primary500) + uiSwitch.onTintColor = UIColor.appColor(.new500) return uiSwitch }() @@ -93,7 +93,7 @@ final class NotiViewController: UIViewController { private let diningImageUploadSwitch: UISwitch = { let uiSwitch = UISwitch() - uiSwitch.onTintColor = UIColor.appColor(.primary500) + uiSwitch.onTintColor = UIColor.appColor(.new500) return uiSwitch }() @@ -123,7 +123,7 @@ final class NotiViewController: UIViewController { private let chatSwitch: UISwitch = { let uiSwitch = UISwitch() - uiSwitch.onTintColor = UIColor.appColor(.primary500) + uiSwitch.onTintColor = UIColor.appColor(.new500) return uiSwitch }() @@ -183,13 +183,13 @@ final class NotiViewController: UIViewController { private let eventSwitch: UISwitch = { let uiSwitch = UISwitch() - uiSwitch.onTintColor = UIColor.appColor(.primary500) + uiSwitch.onTintColor = UIColor.appColor(.new500) return uiSwitch }() private let reviewSwitch: UISwitch = { let uiSwitch = UISwitch() - uiSwitch.onTintColor = UIColor.appColor(.primary500) + uiSwitch.onTintColor = UIColor.appColor(.new500) return uiSwitch }() @@ -235,9 +235,8 @@ final class NotiViewController: UIViewController { self.mealLabels.append(label) // 스위치 생성 let switchControl = UISwitch() - switchControl.onTintColor = UIColor.appColor(.primary500) + switchControl.onTintColor = UIColor.appColor(.new500) wrapView.addSubview(switchControl) - switchControl.transform = CGAffineTransformMakeScale(0.9, 0.75) switchControl.snp.makeConstraints { switchControl in switchControl.trailing.equalToSuperview().inset(21) switchControl.top.equalToSuperview().inset(15) @@ -278,7 +277,7 @@ final class NotiViewController: UIViewController { private let callVanSwitch: UISwitch = { let uiSwitch = UISwitch() - uiSwitch.onTintColor = UIColor.appColor(.primary500) + uiSwitch.onTintColor = UIColor.appColor(.new500) return uiSwitch }() @@ -320,7 +319,7 @@ final class NotiViewController: UIViewController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(true) - configureNavigationBar(style: .fill) + configureNavigationBar(style: .empty) } // MARK: - Bind @@ -548,7 +547,6 @@ extension NotiViewController { make.top.equalTo(16) } - soldOutSwitch.transform = CGAffineTransformMakeScale(0.9, 0.75) soldOutSwitch.snp.makeConstraints { make in make.trailing.equalTo(view.snp.trailing).inset(21) make.top.equalToSuperview().inset(15) @@ -583,7 +581,6 @@ extension NotiViewController { make.top.equalTo(16) } - diningImageUploadSwitch.transform = CGAffineTransformMakeScale(0.9, 0.75) diningImageUploadSwitch.snp.makeConstraints { make in make.trailing.equalTo(view.snp.trailing).inset(21) make.top.equalToSuperview().inset(15) @@ -614,7 +611,6 @@ extension NotiViewController { make.top.equalTo(chatNotiLabel.snp.bottom).offset(8) make.height.equalTo(17) } - chatSwitch.transform = CGAffineTransformMakeScale(0.9, 0.75) chatSwitch.snp.makeConstraints { make in make.trailing.equalTo(view.snp.trailing).inset(21) make.top.equalToSuperview().inset(15) @@ -645,9 +641,7 @@ extension NotiViewController { keywordNotiChevronImage.snp.makeConstraints { make in make.trailing.equalToSuperview().inset(21) - make.top.equalToSuperview().inset(15) - make.width.equalTo(16) - make.height.equalTo(20) + make.centerY.equalToSuperview() } lostItemKeywordNotiLabel.snp.makeConstraints { make in @@ -664,9 +658,7 @@ extension NotiViewController { lostItemKeywordNotiChevronImage.snp.makeConstraints { make in make.trailing.equalToSuperview().inset(21) - make.top.equalToSuperview().inset(15) - make.width.equalTo(16) - make.height.equalTo(20) + make.centerY.equalToSuperview() } shopGuideLabel.snp.makeConstraints { make in @@ -686,8 +678,7 @@ extension NotiViewController { make.height.equalTo(26) make.top.equalTo(16) } - - eventSwitch.transform = CGAffineTransformMakeScale(0.9, 0.75) + eventSwitch.snp.makeConstraints { make in make.trailing.equalTo(view.snp.trailing).inset(21) make.top.equalToSuperview().inset(15) @@ -710,7 +701,6 @@ extension NotiViewController { make.top.equalTo(16) } - reviewSwitch.transform = CGAffineTransformMakeScale(0.9, 0.75) reviewSwitch.snp.makeConstraints { make in make.trailing.equalTo(view.snp.trailing).inset(21) make.top.equalToSuperview().inset(15) @@ -736,7 +726,6 @@ extension NotiViewController { make.height.equalTo(26) make.top.equalTo(16) } - callVanSwitch.transform = CGAffineTransformMakeScale(0.9, 0.75) callVanSwitch.snp.makeConstraints { make in make.trailing.equalTo(view.snp.trailing).inset(21) make.top.equalToSuperview().inset(15) diff --git a/Koin/Presentation/Setting/Policy/PolicyViewController.swift b/Koin/Presentation/Setting/Policy/PolicyViewController.swift index 71c215df..a486b402 100644 --- a/Koin/Presentation/Setting/Policy/PolicyViewController.swift +++ b/Koin/Presentation/Setting/Policy/PolicyViewController.swift @@ -63,7 +63,7 @@ final class PolicyViewController: UIViewController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) - configureNavigationBar(style: .fill) + configureNavigationBar(style: .empty) } private func bind() { diff --git a/Koin/Presentation/Setting/Settings/SettingsViewController.swift b/Koin/Presentation/Setting/Settings/SettingsViewController.swift index ab85e5d0..db250eb7 100644 --- a/Koin/Presentation/Setting/Settings/SettingsViewController.swift +++ b/Koin/Presentation/Setting/Settings/SettingsViewController.swift @@ -108,7 +108,7 @@ final class SettingsViewController: UIViewController { self.recentVersionLabel.textColor = UIColor.appColor(.neutral400) } else { self.recentVersionLabel.text = "최신 버전 \(version)" - self.recentVersionLabel.textColor = UIColor.appColor(.primary500) + self.recentVersionLabel.textColor = UIColor.appColor(.new500) } } }