원하는 뷰컨트롤러에서 속성, 메서드 설정
class VC: UIViewController {
var selectedButtonTag: Int? {
didSet {
updateButtonSelectionStates()
}
}
for (index, (title, image)) in zip(titles, images).enumerated() {
let customButtonView = CustomButtonView(image: image, title: title)
customButtonView.tag = index
customButtonView.delegate = self
buttonsStackView.addArrangedSubview(customButtonView)
}
}
extension VC: CustomButtonViewDelegate {
func customButtonViewTapped(_ view: CustomButtonView) {
print("Button tapped: \(view.tag)")
radioButtonTapped(view)
}
@objc func radioButtonTapped(_ sender: CustomButtonView) {
print("Radio button tapped: \(sender.tag)")
selectedButtonTag = sender.tag
updateButtonSelectionStates()
}
func updateButtonSelectionStates() {
for case let button as CustomButtonView in buttonsStackView.arrangedSubviews {
button.isSelected = (button.tag == selectedButtonTag)
}
}
}
커스텀 버튼제작
protocol CustomButtonViewDelegate: AnyObject {
func customButtonViewTapped(_ view: CustomButtonView)
}
class CustomButtonView: UIView {
weak var delegate: CustomButtonViewDelegate?
private let imageButton = UIButton()
private let titleLabel = UILabel()
private let selectionIndicator = UIView()
var isSelected: Bool = false {
didSet {
selectionIndicator.isHidden = !isSelected
}
}
var selectedButtonTag: Int?
// 초기화 메서드
init(image: UIImage?, title: String) {
super.init(frame: .zero)
imageButton.setImage(image, for: .normal)
titleLabel.text = title
isSelected = false
setupLayout()
addTapGestureRecognizer()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
private func setupLayout() {
// 레이아웃 설정 메서드 ...
selectionIndicator.isHidden = true // 초기 상태는 숨김으로 설정
}
// 초기화 메서드 내 또는 별도 메서드로 탭 제스처 인식자 추가
private func addTapGestureRecognizer() {
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(viewTapped))
self.isUserInteractionEnabled = true
self.addGestureRecognizer(tapGesture)
}
@objc private func viewTapped() {
delegate?.customButtonViewTapped(self)
}
}