タイトルの通りです。
縦に配置したいこともあり(あとは見栄え的な問題で)、UISegmentedControlを用いずにラジオボタンを実装したかったのですが、調べても記事が古かったり、初心者の自分には手をつけがたい手法が多かったので、自分が理解できる手法で実装しました。
また、今回のコードでは、ボタンの数が可変的でも対応できるようにしています。
バージョン
xcode: 11.2.1
swift: 5.1.2
準備
ボタンの画像を用意してAdd Fileからプロジェクトに追加します。
チェックボックスのフリー素材は探せばありますが、枠だけの方がないことが多かったので、自分はMac標準のプレビューで描きました。
実装
ボタンをクリックしたときのsenderを用いて、ボタンの画像をcheck_on.pngに変えるとともに、ボタンのtagを活用してすでにチェックされているボタンをcheck_off.pngに変えているだけです。(tagを用いずに全てのボタンを一度check_off.pngに変えてもいいのですが)
ViewController.swift
importUIKitclassResultWindow:UIViewController{varNumberOfButtons:Int=5//ボタンの数varCheckedButtonTag=0//チェックされているボタンのタグ//それぞれ画像を読み込むletcheckedImage=UIImage(named:"check_on")!asUIImageletuncheckedImage=UIImage(named:"check_off")!asUIImage//ラジオボタンを配置するfuncset_radiobutton(num:Int){letbutton=UIButton()letcenter=Int(UIScreen.main.bounds.size.width/2)//中央の位置lety=170+45*num//ボタン同士が重ならないようyを調整button.setImage(uncheckedImage,for:UIControl.State.normal)button.addTarget(self,action:#selector(butttonClicked(_:)),for:UIControl.Event.touchUpInside)button.frame=CGRect(x:center-120,y:y,width:40,height:40)button.tag=numself.view.addSubview(button)}//押されたボタンの画像をcheck_on.pngに変える@objcfuncbutttonClicked(_sender:UIButton){ChangeToUnchecked(num:CheckedButtonTag)letbutton=senderbutton.setImage(checkedImage,for:UIControl.State.normal)CheckedButtonTag=button.tag//check_on.pngになっているボタンのtagを更新}//すでにcheck_on.pngになっているボタンの画像をcheck_off.pngに変えるfuncChangeToUnchecked(num:Int){forvinview.subviews{ifletv=vas?UIButton,v.tag==num{v.setImage(uncheckedImage,for:UIControl.State.normal)}}}overridefuncviewDidLoad(){super.viewDidLoad()foriin0..<NumberOfButtons{set_radiobutton(num:i)}}}
ラベルとかのコードは載せませんでしたがこんな感じでラジオボタンの実装はできると思います。
お粗末様でした。