programing

swift(iOS)에서 라디오 버튼과 체크박스를 만드는 방법?

newstyles 2023. 10. 21. 10:04

swift(iOS)에서 라디오 버튼과 체크박스를 만드는 방법?

저는 설문조사를 할 수 있는 앱을 개발하고 있습니다.제 레이아웃은 XML 기반 질문에서 생성됩니다.

라디오 버튼(단일 선택)과 체크박스(복수응답)를 만들어야 합니다.저는 신속한 처리에 유용한 것을 발견하지 못했습니다.

생각나는 사람 있습니까?

확인란

Swift를 사용하여 UI 버튼을 확장하는 CheckBox 컨트롤을 직접 만들 수 있습니다.

import UIKit

class CheckBox: UIButton {
    // Images
    let checkedImage = UIImage(named: "ic_check_box")! as UIImage
    let uncheckedImage = UIImage(named: "ic_check_box_outline_blank")! as UIImage
    
    // Bool property
    var isChecked: Bool = false {
        didSet {
            if isChecked == true {
                self.setImage(checkedImage, for: UIControl.State.normal)
            } else {
                self.setImage(uncheckedImage, for: UIControl.State.normal)
            }
        }
    }
        
    override func awakeFromNib() {
        self.addTarget(self, action:#selector(buttonClicked(sender:)), for: UIControl.Event.touchUpInside)
        self.isChecked = false
    }
        
    @objc func buttonClicked(sender: UIButton) {
        if sender == self {
            isChecked = !isChecked
        }
    }
}

그런 다음 Interface Builder를 사용하여 보기에 추가합니다.

enter image description here

라디오 단추

라디오 버튼도 비슷한 방법으로 해결할 수 있습니다.

예를 들어, 전형적인 성별 선택 여성 - 남성:

enter image description here

import UIKit

class RadioButton: UIButton {
    var alternateButton:Array<RadioButton>?
    
    override func awakeFromNib() {
        self.layer.cornerRadius = 5
        self.layer.borderWidth = 2.0
        self.layer.masksToBounds = true
    }
    
    func unselectAlternateButtons() {
        if alternateButton != nil {
            self.isSelected = true
            
            for aButton:RadioButton in alternateButton! {
                aButton.isSelected = false
            }
        } else {
            toggleButton()
        }
    }
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        unselectAlternateButtons()
        super.touchesBegan(touches, with: event)
    }
    
    func toggleButton() {
        self.isSelected = !isSelected
    }
    
    override var isSelected: Bool {
        didSet {
            if isSelected {
                self.layer.borderColor = Color.turquoise.cgColor
            } else {
                self.layer.borderColor = Color.grey_99.cgColor
            }
        }
    }
}

라디오 버튼은 다음과 같이 시작할 수 있습니다.

    override func awakeFromNib() {
        self.view.layoutIfNeeded()
        
        womanRadioButton.selected = true
        manRadioButton.selected = false
    }
    
    override func viewDidLoad() {
        womanRadioButton?.alternateButton = [manRadioButton!]
        manRadioButton?.alternateButton = [womanRadioButton!]
    }

라디오 버튼 및 체크박스의 경우 기본 제공되는 것이 없습니다.

체크박스는 본인이 쉽게 구현할 수 있습니다.UIControlState Normal(UIC 컨트롤 상태 정상)의 경우 버튼에 대해 선택하지 않은 이미지를 설정하고 UIC ControlState Selected(UIC 컨트롤 상태 선택)의 경우 선택한 이미지를 설정할 수 있습니다.이제 버튼을 누르면 이미지가 변경되고 선택한 이미지와 선택하지 않은 이미지가 번갈아 표시됩니다.

라디오 버튼을 사용하려면, 당신은 다음을 유지해야 합니다.Array라디오 버튼으로 동작할 모든 버튼에 대해 선택합니다.버튼을 누를 때마다 배열의 다른 모든 버튼을 선택 취소해야 합니다.

라디오 버튼의 경우 SSRadioButtonsController 컨트롤러 개체를 만들고 다음과 같이 버튼 배열을 추가할 수 있습니다.

var radioButtonController = SSRadioButtonsController()
radioButtonController.setButtonsArray([button1!,button2!,button3!])

주요 원칙은 여기에 이런 것입니다.

스위프트 5, 애니메이션이 있는 체크박스

참고:- 다음을 제거하려면blue배경을 사용하는 동안isSelectedUI 단추 유형을 다음에서 변경합니다.System.Custom

확인란 및 라디오 단추 https://github.com/rashidlatif55/CheckBoxAndRadioButton 에 대한 예제 확인

버튼의 콘센트 만들기

@IBOutlet weak var checkBoxOutlet:UIButton!{
        didSet{
            checkBoxOutlet.setImage(UIImage(named:"unchecked"), for: .normal)
            checkBoxOutlet.setImage(UIImage(named:"checked"), for: .selected)
        }
    }

UI 버튼의 확장자 만들기

extension UIButton {
    //MARK:- Animate check mark
    func checkboxAnimation(closure: @escaping () -> Void){
        guard let image = self.imageView else {return}
        
        UIView.animate(withDuration: 0.1, delay: 0.1, options: .curveLinear, animations: {
            image.transform = CGAffineTransform(scaleX: 0.85, y: 0.85)
            
        }) { (success) in
            UIView.animate(withDuration: 0.1, delay: 0, options: .curveLinear, animations: {
                self.isSelected = !self.isSelected
                //to-do
                closure()
                image.transform = .identity
            }, completion: nil)
        }
        
    }
}

사용방법

 @IBAction func checkbox(_ sender: UIButton){
        sender.checkboxAnimation {
            print("I'm done")
            //here you can also track the Checked, UnChecked state with sender.isSelected
            print(sender.isSelected)
            
        }
}

DL 라디오 버튼을 확인합니다.Interface Builder에서 직접 라디오 버튼을 추가하고 사용자 지정할 수 있습니다.함께 작동합니다.Swift완벽하게

Swift Radio Button for iOS

업데이트: 버전1.3.2사각형 버튼 추가, 성능 향상

업데이트: 버전1.4.4multiple selection 옵션을 추가하여 체크박스로도 사용할 수 있습니다.

업데이트: 버전1.4.7RTL 언어 지원이 추가되었습니다.

타사 라이브러리를 사용하지 않는 Swift 4.2의 Radio Button용 솔루션

RadioButtonController.swift 파일을 만들고 그 안에 다음 코드를 넣습니다.

import UIKit

class RadioButtonController: NSObject {
    var buttonsArray: [UIButton]! {
        didSet {
            for b in buttonsArray {
                b.setImage(UIImage(named: "radio_off"), for: .normal)
                b.setImage(UIImage(named: "radio_on"), for: .selected)
            }
        }
    }
    var selectedButton: UIButton?
    var defaultButton: UIButton = UIButton() {
        didSet {
            buttonArrayUpdated(buttonSelected: self.defaultButton)
        }
    }

    func buttonArrayUpdated(buttonSelected: UIButton) {
        for b in buttonsArray {
            if b == buttonSelected {
                selectedButton = b
                b.isSelected = true
            } else {
                b.isSelected = false
            }
        }
    }
}

보기 컨트롤러 파일에서 아래와 같이 사용합니다.

import UIKit

class CheckoutVC: UIViewController {

    @IBOutlet weak var btnPaytm: UIButton!
    @IBOutlet weak var btnOnline: UIButton!
    @IBOutlet weak var btnCOD: UIButton!

    let radioController: RadioButtonController = RadioButtonController()

    override func viewDidLoad() {
        super.viewDidLoad()

        radioController.buttonsArray = [btnPaytm,btnCOD,btnOnline]
        radioController.defaultButton = btnPaytm
    }

    @IBAction func btnPaytmAction(_ sender: UIButton) {
        radioController.buttonArrayUpdated(buttonSelected: sender)
    }

    @IBAction func btnOnlineAction(_ sender: UIButton) {
        radioController.buttonArrayUpdated(buttonSelected: sender)
    }

    @IBAction func btnCodAction(_ sender: UIButton) {
        radioController.buttonArrayUpdated(buttonSelected: sender)
    }
}

Assets(자산)에서 radio_ooff(무선o_o오프) 및 radio_ooff 및 radi radin 이미지를 추가해야 합니다.

radio on image radio off image

결과:

radio button result

이를 위해 사용할 수 있는 정말 훌륭한 라이브러리가 있습니다(실제로 이 라이브러리를 대신하여 사용할 수 있습니다).UISwitch): https://github.com/Boris-Em/BEMCheckBox

설치가 쉽습니다.

BEMCheckBox *myCheckBox = [[BEMCheckBox alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
[self.view addSubview:myCheckBox];

원 및 사각형 확인란을 제공합니다.

enter image description here

애니메이션도 제작합니다.

enter image description here

short ios swift 4 버전:

@IBAction func checkBoxBtnTapped(_ sender: UIButton) {
        if checkBoxBtn.isSelected {
            checkBoxBtn.setBackgroundImage(#imageLiteral(resourceName: "ic_signup_unchecked"), for: .normal)
        } else {
            checkBoxBtn.setBackgroundImage(#imageLiteral(resourceName: "ic_signup_checked"), for:.normal)
        }
        checkBoxBtn.isSelected = !checkBoxBtn.isSelected
    }

매우 간단한 확인란 컨트롤.

 @IBAction func btn_box(sender: UIButton) {
    if (btn_box.selected == true)
    {
        btn_box.setBackgroundImage(UIImage(named: "box"), forState: UIControlState.Normal)

            btn_box.selected = false;
    }
    else
    {
        btn_box.setBackgroundImage(UIImage(named: "checkBox"), forState: UIControlState.Normal)

        btn_box.selected = true;
    }
}

확인란의 경우 UI 단추를 서브클래스할 필요가 없습니다.그것은 이미.isSelected이 일을 처리할 수 있는 재산.

checkbox = UIButton.init(type: .custom)
checkbox.setImage(UIImage.init(named: "iconCheckboxOutlined"), for: .normal)
checkbox.setImage(UIImage.init(named: "iconCheckboxFilled"), for: .selected)
checkbox.addTarget(self, action: #selector(self.toggleCheckboxSelection), for: .touchUpInside)

그럼 행동 방식을 전환하는 것은isSelected주.

@objc func toggleCheckboxSelection() {
    checkbox.isSelected = !checkbox.isSelected
}

라디오 버튼을 만드는 단계

Basic Step : Two Button.선택한 것과 선택하지 않은 것 모두에 대해 이미지를 설정합니다.두 버튼 모두에 액션을 추가하는 것보다.지금시작코드

1)변수 만들기:

var btnTag    : Int = 0

2)In ViewDidLoad 정의:

 btnTag = btnSelected.tag

3)지금 선택한 탭 작업 중:

 @IBAction func btnSelectedTapped(sender: AnyObject) {
    btnTag = 1
    if btnTag == 1 {
      btnSelected.setImage(UIImage(named: "icon_radioSelected"), forState: .Normal)
      btnUnSelected.setImage(UIImage(named: "icon_radioUnSelected"), forState: .Normal)
     btnTag = 0
    }
}

4)체크 해제 버튼에 대한 Do code

 @IBAction func btnUnSelectedTapped(sender: AnyObject) {
    btnTag = 1
    if btnTag == 1 {
        btnUnSelected.setImage(UIImage(named: "icon_radioSelected"), forState: .Normal)
        btnSelected.setImage(UIImage(named: "icon_radioUnSelected"), forState: .Normal)
        btnTag = 0
    }
}

라디오 버튼이 준비되었습니다.

UI 버튼을 서브클래스하고 필요에 맞게 도면 코드를 직접 작성하면 됩니다.저는 아래 코드를 이용하여 안드로이드와 같은 라디오 버튼을 구현하였습니다.스토리보드에서도 사용할 수 있습니다.Github repo에서 예제 참조

import UIKit

@IBDesignable
class SPRadioButton: UIButton {

@IBInspectable
var gap:CGFloat = 8 {
    didSet {
        self.setNeedsDisplay()
    }
}

@IBInspectable
var btnColor: UIColor = UIColor.green{
    didSet{
        self.setNeedsDisplay()
    }
}

@IBInspectable
var isOn: Bool = true{
    didSet{
        self.setNeedsDisplay()
    }
}

override func draw(_ rect: CGRect) {
    self.contentMode = .scaleAspectFill
    drawCircles(rect: rect)
}


//MARK:- Draw inner and outer circles
func drawCircles(rect: CGRect){
    var path = UIBezierPath()
    path = UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: rect.width, height: rect.height))

    let circleLayer = CAShapeLayer()
    circleLayer.path = path.cgPath
    circleLayer.lineWidth = 3
    circleLayer.strokeColor = btnColor.cgColor
    circleLayer.fillColor = UIColor.white.cgColor
    layer.addSublayer(circleLayer)

    if isOn {
        let innerCircleLayer = CAShapeLayer()
        let rectForInnerCircle = CGRect(x: gap, y: gap, width: rect.width - 2 * gap, height: rect.height - 2 * gap)
        innerCircleLayer.path = UIBezierPath(ovalIn: rectForInnerCircle).cgPath
        innerCircleLayer.fillColor = btnColor.cgColor
        layer.addSublayer(innerCircleLayer)
    }
    self.layer.shouldRasterize =  true
    self.layer.rasterizationScale = UIScreen.main.nativeScale
}

/*
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    isOn = !isOn
    self.setNeedsDisplay()
}
*/    

override func awakeFromNib() {
    super.awakeFromNib()
    addTarget(self, action: #selector(buttonClicked(sender:)), for: UIControl.Event.touchUpInside)
    isOn = false
}

@objc func buttonClicked(sender: UIButton) {
    if sender == self {
        isOn = !isOn
        setNeedsDisplay()
    }
}
}

제가 작업하고 있는 Mac 어플리케이션에서 이 문제를 다루기 위해 아주 간단한 수업을 만들었습니다.이것이 누군가에게 도움이 되기를 바랍니다.

라디오 버튼 컨트롤러 클래스:

class RadioButtonController: NSObject {

var buttonArray : [NSButton] = []
var currentleySelectedButton : NSButton?
var defaultButton : NSButton = NSButton() {
    didSet {
        buttonArrayUpdated(buttonSelected: self.defaultButton)
    }
}

func buttonArrayUpdated(buttonSelected : NSButton) {
    for button in buttonArray {
        if button == buttonSelected {
            currentleySelectedButton = button
            button.state = .on
        } else {
            button.state = .off
        }
    }
}

}

View Controller에서 구현:

class OnboardingDefaultLaunchConfiguration: NSViewController {

let radioButtonController : RadioButtonController = RadioButtonController()
@IBOutlet weak var firstRadioButton: NSButton!
@IBOutlet weak var secondRadioButton: NSButton!

@IBAction func folderRadioButtonSelected(_ sender: Any) {
    radioButtonController.buttonArrayUpdated(buttonSelected: folderGroupRadioButton)
}

@IBAction func fileListRadioButtonSelected(_ sender: Any) {
    radioButtonController.buttonArrayUpdated(buttonSelected: fileListRadioButton)
}

override func viewDidLoad() {
    super.viewDidLoad()
    radioButtonController.buttonArray = [firstRadioButton, secondRadioButton]
    radioButtonController.defaultButton = firstRadioButton
}

}

확인란에는 실제로 UITableViewCell 액세서리 형태의 내장 솔루션이 있습니다.양식을 UITable View로 설정하고 각 셀을 선택 가능한 옵션으로 사용할 수 있습니다.accessoryType선택한 항목에 대한 체크 표시를 설정합니다.

의사 코드 예제는 다음과 같습니다.

    let items = [SelectableItem]

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


        // Get the item for the current row
        let item = self.items[indexPath.row]

        // ...dequeue and set up the `cell` as you wish...

        // Use accessoryType property to mark the row as checked or not...
        cell.accessoryType = item.selected ? .checkmark : .none
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        // Unselect row
        tableView.deselectRow(at: indexPath, animated: false)

        // Toggle selection
        let item = self.items[indexPath.row]
        item.selected = !item.selected
        tableView.reloadData()
    }

그러나 라디오 버튼은 사용자 지정 구현이 필요합니다. 다른 답변을 참조하십시오.

확인란 버튼을 선택하거나 선택을 취소하는 것은 보기 범위를 벗어나는 것입니다.뷰 자체는 요소를 그리는 것만 신경써야 하고, 그 내부 상태에 대해 결정해서는 안 됩니다.제가 제안하는 구현 방법은 다음과 같습니다.

import UIKit

class Checkbox: UIButton {

    let checkedImage = UIImage(named: "checked")
    let uncheckedImage = UIImage(named: "uncheked")
    var action: ((Bool) -> Void)? = nil

    private(set) var isChecked: Bool = false {
        didSet{
            self.setImage(
                self.isChecked ? self.checkedImage : self.uncheckedImage,
                for: .normal
            )
        }
    }

    override func awakeFromNib() {
        self.addTarget(
            self,
            action:#selector(buttonClicked(sender:)),
            for: .touchUpInside
        )
        self.isChecked = false
    }

    @objc func buttonClicked(sender: UIButton) {
        if sender == self {
            self.action?(!self.isChecked)
        }
    }

    func update(checked: Bool) {
        self.isChecked = checked
    }
}

Interface Builder와 함께 사용하거나 프로그래밍 방식으로 사용할 수 있습니다.보기의 사용 예는 다음과 같습니다.

let checkbox_field = Checkbox(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
checkbox_field.action = { [weak checkbox_field] checked in
    // any further checks and business logic could be done here
    checkbox_field?.update(checked: checked)
}

제가 코멘트를 할 만큼 평판이 좋지 않기 때문에 여기에 제 Salil Dwahan 버전을 남겨두겠습니다.스위프트 5, X 코드 11.3에서 작동합니다.

먼저 단추를 IB에 놓고 "Custom"을 선택한 후 Assistant Layout(+CtrlDrag)을 사용하여 콘센트와 작업을 만듭니다.다음 코드를 포함하면 다음과 같이 끝납니다.

class YourViewController: UIViewController {
    @IBOutlet weak var checkbox: UIButton!
    @IBAction func checkboxTapped(_ sender: UIButton) {
        checkbox.isSelected = !checkbox.isSelected
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        checkbox.setImage(UIImage.init(named: "checkMark"), for: .selected)
    }
}

이미지를 자산에 추가하고 이름을 일치하도록 변경하는 것을 잊지 마십시오!

checkbox.isSelected확인하는 방법입니다.

답변 중 일부에서는 선택 상태를 사용하여 버튼의 선택 상태에 대한 이미지를 설정할 수 있다고 올바르게 언급하지만, 버튼에 이미지와 텍스트가 모두 있어야 하는 경우에는 우아하게 작동하지 않습니다.

많은 경우와 마찬가지로 UI 버튼을 서브클래싱하는 것으로 마쳤지만 Interface Builder에서 이미지 설정 지원을 추가했습니다.

아래는 제 코드입니다.

import UIKit

class CustomCheckbox: UIButton {

    @IBInspectable var defaultStateImage: UIImage? = nil {
        didSet{
            self.setNeedsDisplay()
        }
    }

    @IBInspectable var selectedStateImage: UIImage? = nil {
        didSet{
            self.setNeedsDisplay()
        }
    }

    @IBInspectable var gapPadding: CGFloat = 0 {
        didSet{
            self.setNeedsDisplay()
        }
    }

    @IBInspectable var isChecked: Bool = false {
        didSet{
            self.setNeedsDisplay()
        }
    }

    var defaultImageView: UIImageView? = nil
    var selectedImageView: UIImageView? = nil

    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }
    required public init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        setup()
    }

    func setup() {
        if(defaultStateImage != nil) {
            defaultImageView = UIImageView(image: defaultStateImage)
            defaultImageView?.translatesAutoresizingMaskIntoConstraints = false

            addSubview(defaultImageView!)

            let length = CGFloat(16)
            titleEdgeInsets.left += length

            NSLayoutConstraint.activate([
                defaultImageView!.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: -gapPadding),
                defaultImageView!.centerYAnchor.constraint(equalTo: self.titleLabel!.centerYAnchor, constant: 0),
                defaultImageView!.widthAnchor.constraint(equalToConstant: length),
                defaultImageView!.heightAnchor.constraint(equalToConstant: length)
            ])
        }

        if(selectedStateImage != nil) {
            selectedImageView = UIImageView(image: selectedStateImage)
            selectedImageView!.translatesAutoresizingMaskIntoConstraints = false

            addSubview(selectedImageView!)

            let length = CGFloat(16)
            titleEdgeInsets.left += length

            NSLayoutConstraint.activate([
                selectedImageView!.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: -gapPadding),
                selectedImageView!.centerYAnchor.constraint(equalTo: self.titleLabel!.centerYAnchor, constant: 0),
                selectedImageView!.widthAnchor.constraint(equalToConstant: length),
                selectedImageView!.heightAnchor.constraint(equalToConstant: length)
            ])
        }

        if defaultImageView != nil {
            defaultImageView!.isHidden = isChecked
        }

        if selectedImageView != nil  {
            selectedImageView!.isHidden = !isChecked
        }

        self.addTarget(self, action: #selector(checkChanged(_:)), for: .touchUpInside)
    }

    @objc func checkChanged(_ btn : UIButton){
        self.isChecked = !self.isChecked

        if defaultImageView != nil {
            defaultImageView!.isHidden = isChecked
        }

        if selectedImageView != nil  {
            selectedImageView!.isHidden = !isChecked
        }
    }
}

  1. 하나는 "YES"로, 다른 하나는 "NO"로 각각 2개의 버튼을 만듭니다.
  2. BOOL 속성 생성 Ex: isNRICitizen = false
  3. 양 버튼에 동일한 버튼 연결을 부여하고 태그 설정 (예: 예 버튼 - 태그 10, 없음 버튼 - 태그 20)
@IBAction func btnAction(_ sender:UIButton) {

isNRICitizen = sender.tag == 10 ? true : false
isNRICitizen ? self.nriCitizenBtnYes.setImage(#imageLiteral(resourceName: "radioChecked"), for: .normal) : self.nriCitizenBtnYes.setImage(#imageLiteral(resourceName: "radioUnchecked"), for: .normal)
        isNRICitizen ? self.nriCitizenBtnNo.setImage(#imageLiteral(resourceName: "radioUnchecked"), for: .normal) : self.nriCitizenBtnNo.setImage(#imageLiteral(resourceName: "radioChecked"), for: .normal)
}

Swift 5.0 업데이트된 Swift용 간단한 라디오 버튼 (라이브러리 없음)

첫 번째 영상을 One Checked(원 체크됨) 버튼과 Second Checked(두 번째 체크됨) 버튼으로 설정합니다.

그런 다음 라디오 버튼의 콘센트 2개를 제공합니다.

@IBOutlet weak var radioMale: UIButton!
@IBOutlet weak var radioFemale: UIButton!

하나의 방법으로 Both Button Action으로 IBaction을 만듭니다.

 @IBAction func btnRadioTapped(_ sender: UIButton) {

    radioMale.setImage(UIImage(named: "Unchecked"), for: .normal)
    radioFemale.setImage(UIImage(named: "Unchecked"), for: .normal)

    if sender.currentImage == UIImage(named: "Unchecked"){

        sender.setImage(UIImage(named: "Checked"), for: .normal)

    }else{

        sender.setImage(UIImage(named: "Unchecked"), for: .normal)
    }

}

쉬운 스위프트를 찾을 수 없었습니다.이 스레드의 UI 버전은 SF 기호를 사용한 빠른 구성 요소입니다.

struct CheckBox: View {

  private let checked = Image("checkmark.square.fill")
  private let unChecked = Image("checkmark.square")
  @State private var isChecked: Bool = false

  var body: some View {
      ZStack {
          isChecked == false ? unChecked : checked
       }.onTapGesture {
          isChecked.toggle()
       }   
   }
}

상태를 변경할 때 Image를 사용하는 경우.시도해 보기:

 var nightButtonState: Bool = false {
     didSet {
         nightButtonState ? autoNightButton.setBackgroundImage(UIImage(named: "unchecked_icon"), for: .normal) : autoNightButton.setBackgroundImage(UIImage(named: "checked_icon"), for: .normal)
     } 
  }

단추 동작:

@IBAction func autoNightButtonAction(_ sender: UIButton) {
  self.nightButtonState.toggle()
}

언급URL : https://stackoverflow.com/questions/29117759/how-to-create-radio-buttons-and-checkbox-in-swift-ios