(UIKit) 라디오 버튼의 구현

0ne·2024년 2월 11일

원하는 뷰컨트롤러에서 속성, 메서드 설정

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)
    }
    

}
profile
@Hanyang univ(seoul). CSE

0개의 댓글