Skip to content

Commit

Permalink
[#6] checkBox, radioButton tintColor 커스텀 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
hye0njuoo committed Oct 9, 2024
1 parent 3119c08 commit 167a7ac
Show file tree
Hide file tree
Showing 19 changed files with 109 additions and 75 deletions.
1 change: 1 addition & 0 deletions Handy/Handy-Storybook/Atom/CheckBoxViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ final class CheckBoxViewController: BaseViewController {

let checkBox: HandyCheckBox = {
let checkBox = HandyCheckBox()
checkBox.setTintColor = .red
return checkBox
}()

Expand Down
2 changes: 2 additions & 0 deletions Handy/Handy-Storybook/Atom/RadioButtonViewController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ final class RadioButtonViewController: BaseViewController {

let radioButton: HandyRadioButton = {
let checkBox = HandyRadioButton()
checkBox.isSelected = true
return checkBox
}()

Expand All @@ -23,6 +24,7 @@ final class RadioButtonViewController: BaseViewController {
let disabledRadioButton: HandyRadioButton = {
let checkBox = HandyRadioButton()
checkBox.isDisabled = true
checkBox.text = "RadioButton"
return checkBox
}()

Expand Down
59 changes: 48 additions & 11 deletions Handy/Handy/Source/Atom/HandyCheckBox.swift
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,15 @@ public class HandyCheckBox: UIButton {
}
}

/**
체크박스의 tintColor를 설정할 때 사용합니다.
*/
public var setTintColor: UIColor = HandySemantic.checkboxSelected {
didSet {
setConfiguration()
}
}

// MARK: - 외부에서 접근할 수 있는 enum

/**
Expand Down Expand Up @@ -94,34 +103,62 @@ public class HandyCheckBox: UIButton {
private func setConfiguration() {
var configuration = UIButton.Configuration.plain()
configuration.baseBackgroundColor = .clear
configuration.contentInsets = NSDirectionalEdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0)
self.configuration = configuration

setTitle()
setImage()
setColor()
updateState()
}

private func setTitle() {
guard var configuration = self.configuration else { return }
configuration.attributedTitle = AttributedString(text ?? "")
configuration.attributedTitle?.font = size.font
self.configuration = configuration
}

private func setImage() {
guard var configuration = self.configuration else { return }

configuration.imagePadding = 8
configuration.imagePlacement = .leading

configuration.contentInsets = NSDirectionalEdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0)
let image: UIImage
if isDisabled || isSelected {
image = HandyIcon.checkBoxFilled
} else {
image = HandyIcon.checkBoxLine
}
configuration.image = image.resize(to: size.iconSize)

self.configuration = configuration
}

switch (isDisabled, isSelected) {
case (true, _):
configuration.image = HandyIcon.checkBoxDisabled.resize(to: size.iconSize)
configuration.baseBackgroundColor = HandySemantic.textBasicPrimary

case (false, true):
configuration.image = HandyIcon.checkBoxSelected.resize(to: size.iconSize)
configuration.baseForegroundColor = HandySemantic.textBasicPrimary
private func setColor() {
guard var configuration = self.configuration else { return }

case (false, false):
configuration.image = HandyIcon.checkBoxUnSelected.resize(to: size.iconSize)
configuration.baseForegroundColor = HandySemantic.textBasicPrimary
if isSelected {
configuration.image = configuration.image?.withTintColor(setTintColor)
}


self.configuration = configuration
}


private func updateState() {
guard var configuration = self.configuration else { return }

configuration.baseForegroundColor = HandySemantic.textBasicPrimary
self.isEnabled = !isDisabled

self.configuration = configuration
}


private func registerTapAction() {
self.addTarget(self,
action: #selector(checkboxDidTap(_:)),
Expand Down
63 changes: 47 additions & 16 deletions Handy/Handy/Source/Atom/HandyRadioButton.swift
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,15 @@ public class HandyRadioButton: UIButton {
}
}

/**
라디오버튼의 tintColor를 설정할 때 사용합니다.
*/
public var setTintColor: UIColor = HandySemantic.checkboxSelected {
didSet {
setConfiguration()
}
}

// MARK: - 외부에서 접근할 수 있는 enum

/**
Expand Down Expand Up @@ -94,44 +103,66 @@ public class HandyRadioButton: UIButton {
private func setConfiguration() {
var configuration = UIButton.Configuration.plain()
configuration.baseBackgroundColor = .clear
configuration.imagePadding = 8
configuration.imagePlacement = .leading
configuration.contentInsets = NSDirectionalEdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0)
self.configuration = configuration

setTitle()
setImage()
setColor()
updateState()
}

private func setTitle() {
guard var configuration = self.configuration else { return }
configuration.attributedTitle = AttributedString(text ?? "")
configuration.attributedTitle?.font = size.font
self.configuration = configuration
}

configuration.imagePadding = 8
configuration.imagePlacement = .leading

configuration.contentInsets = NSDirectionalEdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0)
private func setImage() {
guard var configuration = self.configuration else { return }

switch (isDisabled, isSelected) {
case (true, _):
if isDisabled {
configuration.image = HandyIcon.radioButtonDisabled.resize(to: size.iconSize)
configuration.baseBackgroundColor = HandySemantic.textBasicPrimary
} else {
configuration.image = HandyIcon.radioButtonLine.resize(to: size.iconSize)
}

self.configuration = configuration
}

case (false, true):
configuration.image = HandyIcon.radioButtonSelected.resize(to: size.iconSize)
configuration.baseForegroundColor = HandySemantic.textBasicPrimary
private func setColor() {
guard var configuration = self.configuration else { return }

case (false, false):
configuration.image = HandyIcon.radioButtonUnselected.resize(to: size.iconSize)
configuration.baseForegroundColor = HandySemantic.textBasicPrimary
if isSelected {
configuration.image = configuration.image?.withTintColor(setTintColor)
}

self.configuration = configuration
}


private func updateState() {
guard var configuration = self.configuration else { return }

configuration.baseForegroundColor = HandySemantic.textBasicPrimary
self.isEnabled = !isDisabled

self.configuration = configuration
}


private func registerTapAction() {
self.addTarget(self,
action: #selector(checkboxDidTap(_:)),
action: #selector(radioButtonDidtap(_:)),
for: .touchUpInside
)
}

@objc
private func checkboxDidTap(_ sender: UIControl) {
private func radioButtonDidtap(_ sender: UIControl) {
self.isSelected = !isSelected
}
}

This file was deleted.

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"images" : [
{
"filename" : "radioButtonDisabled.svg",
"filename" : "RadioButtonDisable.svg",
"idiom" : "universal"
}
],
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

This file was deleted.

This file was deleted.

8 changes: 3 additions & 5 deletions Handy/Handy/Source/Foundation/HandyIcon.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,9 @@ public enum HandyIcon {
public static var icCancelFilled: UIImage { .load(name: "icCancelFilled") }
public static var icCancelLine: UIImage { .load(name: "icCancelLine") }

public static var checkBoxUnSelected: UIImage { .load(name: "checkBoxUnSelected") }
public static var checkBoxSelected: UIImage { .load(name: "checkBoxSelected") }
public static var checkBoxDisabled: UIImage { .load(name: "checkBoxDisabled") }
public static var radioButtonUnselected: UIImage { .load(name: "radioButtonUnselected") }
public static var radioButtonSelected: UIImage { .load(name: "radioButtonSelected") }
public static var checkBoxFilled: UIImage { .load(name: "checkBoxFilled") }
public static var checkBoxLine: UIImage { .load(name: "checkBoxLine") }
public static var radioButtonLine: UIImage { .load(name: "radioButtonLine") }
public static var radioButtonDisabled: UIImage { .load(name: "radioButtonDisabled") }
}

Expand Down

0 comments on commit 167a7ac

Please sign in to comment.