如何在swift(iOS)中创build单选button和checkbox?
我正在开发一个允许进行调查的应用程序。 我的布局是从基于XML的问题生成的。
我需要创build单选button(单选)和checkbox(多个答案)。 我没有发现任何有用的迅速。
有没有人有一个想法?
对于单选button和checkbox,没有内置任何东西。
你可以自己实现checkbox。 你可以为UIControlStateNormal设置一个uncheckedImage,为你的UIControlStateSelected设置一个checkedImage。 现在点击button将改变它的图像,并在选中和未选中的图像之间交替。
要使用单选button,必须为所有button保留一个Array
,作为单选button。 无论何时按下button,您都需要取消选中arrays中的所有其他button。
对于单选button,您可以使用SSRadioButtonsController您可以创build一个控制器对象并向其添加button数组
var radioButtonController = SSRadioButtonsController() radioButtonController.setButtonsArray([button1!,button2!,button3!])
主要原理是这样的。
checkbox
你可以创build你自己的CheckBox控件,用Swift扩展UIButton( 编辑成Swift 3 ):
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: UIControlState.normal) } else { self.setImage(uncheckedImage, for: UIControlState.normal) } } } override func awakeFromNib() { self.addTarget(self, action:#selector(buttonClicked(sender:)), for: UIControlEvents.touchUpInside) self.isChecked = false } func buttonClicked(sender: UIButton) { if sender == self { isChecked = !isChecked } } }
然后使用Interface Builder将其添加到您的视图中:
单选button
单选button可以用类似的方法解决。
例如,经典的性别select女人 :
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 } } } }
你可以像这样初始化你的单选button:
override func awakeFromNib() { self.view.layoutIfNeeded() womanRadioButton.selected = true manRadioButton.selected = false } override func viewDidLoad() { womanRadioButton?.alternateButton = [manRadioButton!] manRadioButton?.alternateButton = [womanRadioButton!] }
希望能帮助到你。
检查出DLRadioButton 。 您可以直接从Interface Builder添加和自定义单选button。 也适用于Swift
完美。
更新:版本1.3.2
添加方形button,也提高了性能。
更新:版本1.4.4
增加了多选选项,也可以用作checkbox。
更新:版本1.4.7
增加了RTL语言支持。
有一个非常好的库,你可以使用它(你可以使用它来代替UISwitch
): https : //github.com/Boris-Em/BEMCheckBox
安装很简单:
BEMCheckBox *myCheckBox = [[BEMCheckBox alloc] initWithFrame:CGRectMake(0, 0, 50, 50)]; [self.view addSubview:myCheckBox];
它提供了圆形和方形checkbox
它也做animation:
一个非常简单的checkbox控件。
@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; } }
创build单选button的步骤
BasicStep:采取两个button。 设置图像为喜欢select和未选中。 比向两个button添加动作。 现在开始代码
1)创buildvariables:
var btnTag : Int = 0
2)在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)做代码UnCheckbutton
@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 } }
单选button准备好了
较短的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 }