개발/iOS
iOS) UIButton Custom해서 CheckBox 만들기
빙수킹
2021. 9. 23. 15:16
iOS에는 안드로이드와 달리 체크박스가 없어서 UIButton을 이용해서 만들어야 한다.
기본 UIButton의 selected 상태를 사용하여 이미지를 변경해 줄 수도 있지만, 확장성을 생각해서 Custom Class를 만들어 보았다.
/// 체크박스
class CheckBox: UIButton {
/// 체크박스 이미지
var checkBoxResouces = OnOffResources(
onImage: UIImage(named: DefaultResource.checkedImage),
offImage: UIImage(named: DefaultResource.notCheckedImage)
) {
didSet {
self.setChecked(isChecked)
}
}
enum DefaultResource {
static let notCheckedImage = "btn_check_off"
static let checkedImage = "btn_check_on"
}
/// 체크 상태 변경
var isChecked: Bool = false {
didSet {
guard isChecked != oldValue else { return }
self.setChecked(isChecked)
}
}
/// 이미지 직접 지정 + init
init(resources: OnOffResources) {
super.init(frame: .zero)
self.checkBoxResouces = resources
commonInit()
}
/// 일반적인 init + checkBoxResources 변경
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
commonInit()
}
private func commonInit() {
self.setImage(checkBoxResouces.offImage, for: .normal)
self.addTarget(self, action: #selector(check), for: .touchUpInside)
self.isChecked = false
}
@objc func check(_ sender: UIGestureRecognizer) {
isChecked.toggle()
}
/// 이미지 변경
private func setChecked(_ isChecked: Bool) {
if isChecked == true {
self.setImage(checkBoxResouces.onImage, for: .normal)
} else {
self.setImage(checkBoxResouces.offImage, for: .normal)
}
}
class OnOffResources {
let onImage: UIImage?
let offImage: UIImage?
init(onImage: UIImage?, offImage: UIImage?) {
self.onImage = onImage
self.offImage = offImage
}
}
}