Skip to content

Commit

Permalink
[#21] @invalidating 관련 코드리뷰 반영
Browse files Browse the repository at this point in the history
  • Loading branch information
wjdalswl committed Jan 13, 2025
1 parent 580d4ec commit c7f04c3
Show file tree
Hide file tree
Showing 4 changed files with 106 additions and 112 deletions.
72 changes: 34 additions & 38 deletions Handy/Handy/Source/Atom/HandyTextField/HandyBaseTextField.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,29 +8,20 @@
import UIKit

public class HandyBaseTextField: UITextField {

// MARK: - 외부에서 지정할 수 있는 속성

/**
텍스트 필드를 비활성화 시킬 때 사용합니다.
*/
@Invalidating(.layout) public var isDisabled: Bool = false {
didSet {
updateState()
}
}

@Invalidating(wrappedValue: false, .display) public var isDisabled: Bool
/**
텍스트 필드의 오류 상태를 나타낼 때 사용합니다.
*/
@Invalidating(.layout) public var isNegative: Bool = false {
didSet {
updateState()
}
}

@Invalidating(wrappedValue: false, .display) public var isNegative: Bool

// MARK: - 내부에서 사용되는 뷰

/**
텍스트 필드 내의 입력을 초기화할 때 사용하는 Clear 버튼입니다.
*/
Expand All @@ -41,9 +32,9 @@ public class HandyBaseTextField: UITextField {
button.isHidden = true
return button
}()

// MARK: - 초기화

/**
초기화 메소드입니다. 기본적인 텍스트 필드 속성과 Clear 버튼을 설정합니다.
*/
Expand All @@ -54,30 +45,30 @@ public class HandyBaseTextField: UITextField {
setupClearButton()
self.delegate = self
}

required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

// MARK: - 설정

/**
텍스트 필드의 기본 속성을 설정합니다.
- 테두리 색상, 패딩, 기본 배경색 등을 포함합니다.
*/
private func setupTextField() {
self.tintColor = HandySemantic.lineStatusPositive
self.layer.cornerRadius = HandySemantic.radiusM
self.layer.borderWidth = 1
self.layer.cornerRadius = HandySemantic.radiusM
self.layer.masksToBounds = true
self.layer.borderColor = HandySemantic.bgBasicLight.cgColor
self.backgroundColor = HandySemantic.bgBasicLight
self.clipsToBounds = true
self.font = HandyFont.B1Rg16

let leftPaddingView = UIView(frame: CGRect(x: 0, y: 0, width: HandyTextFieldConstants.Dimension.leftMargin, height: 0))
self.leftView = leftPaddingView
self.leftViewMode = .always

let rightPaddingView = UIView(frame: CGRect(x: 0, y: 0, width: HandyTextFieldConstants.Dimension.rightMargin, height: 0))
self.rightView = rightPaddingView
self.rightViewMode = .always
Expand All @@ -96,31 +87,31 @@ public class HandyBaseTextField: UITextField {
.foregroundColor: color,
.font: HandyFont.B1Rg16
]

if let placeholder = self.placeholder {
self.attributedPlaceholder = NSAttributedString(string: placeholder, attributes: attributes)
}
}

/**
Clear 버튼을 설정합니다.
- Clear 버튼은 텍스트 필드 오른쪽에 위치하며, 텍스트 입력 상태에 따라 표시됩니다.
*/
private func setupClearButton() {
addSubview(clearButton)
clearButton.addTarget(self, action: #selector(clearText), for: .touchUpInside)

clearButton.snp.makeConstraints {
$0.centerY.equalToSuperview()
$0.trailing.equalToSuperview().inset(HandyTextFieldConstants.Dimension.clearButtonDefaultRightMargin)
$0.width.height.equalTo(HandyTextFieldConstants.Dimension.clearButtonSize)
}

addTarget(self, action: #selector(textDidChange), for: .editingChanged)
}

// MARK: - 상태 관리

/**
텍스트 필드의 상태에 따라 UI를 업데이트합니다.
- `isDisabled`: 비활성화 상태를 나타냅니다.
Expand All @@ -136,7 +127,7 @@ public class HandyBaseTextField: UITextField {
clearButton.isHidden = true
return
}

if isNegative {
self.isUserInteractionEnabled = true
self.layer.borderColor = HandySemantic.lineStatusNegative.cgColor
Expand All @@ -145,16 +136,16 @@ public class HandyBaseTextField: UITextField {
clearButton.isHidden = false
return
}

self.isUserInteractionEnabled = true
self.layer.borderColor = HandySemantic.bgBasicLight.cgColor
self.textColor = HandySemantic.textBasicPrimary
updatePlaceholderColorAndFont(color: HandySemantic.textBasicTertiary)
clearButton.isHidden = self.text?.isEmpty ?? true
}

// MARK: - Clear 버튼 동작

/**
텍스트 필드의 텍스트를 초기화합니다.
- Clear 버튼이 눌렸을 때 호출됩니다.
Expand All @@ -163,17 +154,17 @@ public class HandyBaseTextField: UITextField {
self.text = ""
clearButton.isHidden = true
}

/**
텍스트 필드의 텍스트 변경 시 호출됩니다.
- 텍스트가 입력되거나 삭제될 때 Clear 버튼의 표시 상태를 업데이트합니다.
*/
@objc private func textDidChange() {
clearButton.isHidden = self.text?.isEmpty ?? true
}

// MARK: - Overridden Methods

/**
Placeholder 및 텍스트 레이아웃을 설정합니다.
*/
Expand All @@ -185,7 +176,7 @@ public class HandyBaseTextField: UITextField {
right: HandyTextFieldConstants.Dimension.rightMargin
))
}

/**
텍스트 입력 시 레이아웃을 설정합니다.
*/
Expand All @@ -197,6 +188,11 @@ public class HandyBaseTextField: UITextField {
right: HandyTextFieldConstants.Dimension.rightMargin
))
}

public override func draw(_ rect: CGRect) {
super.draw(rect)
updateState()
}
}

// MARK: - UITextFieldDelegate
Expand Down
63 changes: 31 additions & 32 deletions Handy/Handy/Source/Atom/HandyTextField/HandyTextFieldView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,43 +9,35 @@ import UIKit
import SnapKit

public class HandyTextFieldView: UIView {

// MARK: - 외부에서 지정할 수 있는 속성

/**
텍스트 필드를 비활성화 시킬 때 사용합니다.
*/
@Invalidating(.layout) public var isDisabled: Bool = false {
didSet {
updateState()
}
}

@Invalidating(wrappedValue: false, .display) public var isDisabled: Bool

/**
텍스트 필드의 오류 상태를 표현할 때 사용합니다.
*/
@Invalidating(.layout) public var isNegative: Bool = false {
didSet {
updateState()
}
}

@Invalidating(wrappedValue: false, .display) public var isNegative: Bool

/**
텍스트 필드의 텍스트를 설정하거나 가져올 때 사용합니다.
*/
public var text: String? {
get { return textField.text }
set { textField.text = newValue }
}

/**
텍스트 필드의 Placeholder를 설정할 때 사용합니다.
*/
public var placeholder: String? {
get { return textField.placeholder }
set { textField.placeholder = newValue }
}

/**
상단 라벨 텍스트를 설정하거나 가져올 때 사용합니다.
- 값이 `nil`일 경우 라벨이 숨겨집니다.
Expand All @@ -57,7 +49,7 @@ public class HandyTextFieldView: UIView {
fieldLabel.isHidden = newValue == nil
}
}

/**
하단 헬퍼 라벨 텍스트를 설정하거나 가져올 때 사용합니다.
- 값이 `nil`일 경우 라벨이 숨겨집니다.
Expand All @@ -69,9 +61,9 @@ public class HandyTextFieldView: UIView {
helperLabel.isHidden = newValue == nil
}
}

// MARK: - UI 구성 요소

/**
텍스트 필드와 라벨들을 담고 있는 스택 뷰입니다.
*/
Expand All @@ -82,29 +74,29 @@ public class HandyTextFieldView: UIView {
stackView.alignment = .fill
return stackView
}()

/**
텍스트 필드 상단에 위치한 라벨입니다.
*/
private let fieldLabelContainer = UIView()

private let fieldLabel = HandyLabel(style: .B5Rg12)

/**
사용자 입력을 위한 기본 텍스트 필드입니다.
- 내부적으로 `HandyBaseTextField`를 사용하여 Clear 버튼 및 상태 관리를 포함합니다.
*/
public let textField = HandyBaseTextField()

/**
텍스트 필드 하단에 위치한 헬퍼 라벨입니다.
*/
private let helperLabelContainer = UIView()

private let helperLabel = HandyLabel(style: .B5Rg12)

// MARK: - 초기화

/**
초기화 메소드입니다. 기본적으로 뷰의 UI 구성 요소를 설정합니다.
*/
Expand All @@ -113,13 +105,13 @@ public class HandyTextFieldView: UIView {
setupView()
updateState()
}

required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

// MARK: - 뷰 구성

/**
뷰의 기본 UI 요소를 설정하고 제약 조건을 추가합니다.
*/
Expand All @@ -128,7 +120,7 @@ public class HandyTextFieldView: UIView {
stackView.snp.makeConstraints {
$0.edges.equalToSuperview()
}

stackView.addArrangedSubview(fieldLabelContainer)
stackView.addArrangedSubview(textField)
stackView.addArrangedSubview(helperLabelContainer)
Expand All @@ -138,7 +130,7 @@ public class HandyTextFieldView: UIView {
$0.leading.equalToSuperview().inset(HandyTextFieldConstants.Dimension.labelInsetWidth)
$0.trailing.verticalEdges.equalToSuperview()
}

helperLabelContainer.addSubview(helperLabel)
helperLabel.snp.makeConstraints {
$0.leading.equalToSuperview().inset(HandyTextFieldConstants.Dimension.labelInsetWidth)
Expand All @@ -149,22 +141,29 @@ public class HandyTextFieldView: UIView {
$0.height.greaterThanOrEqualTo(HandyTextFieldConstants.Dimension.textFieldHeight)
}
}

// MARK: - 상태 관리

/**
`isDisabled` 및 `isNegative` 속성에 따라 라벨과 텍스트 필드 상태를 업데이트합니다.
*/
private func updateState() {
textField.isDisabled = isDisabled
textField.isNegative = isNegative

fieldLabel.textColor = HandySemantic.textBasicTertiary
helperLabel.textColor = HandySemantic.textBasicTertiary

if isNegative {
helperLabel.textColor = HandySemantic.lineStatusNegative
}
}

// MARK: - Overridden Methods

public override func draw(_ rect: CGRect) {
super.draw(rect)
updateState()
}
}

Loading

0 comments on commit c7f04c3

Please sign in to comment.