自定义iOS UIPickerView
在本教程中,我们将在iOS应用程序中自定义UIPickerView属性。
在上一教程中,我们实现了UIPickerView类,并讨论了一些重要的帮助程序属性和功能。
UIPickerView
我们知道UIPickerView需要两个协议:" UIPickerViewDataSource"," UIPickerViewDelegate"。
除了我们已经讨论过的必需方法之外,我们还可以使用以下方法来自定义UIPickerView的UI。
func pickerView(_ pickerView: UIPickerView, widthForComponent component: Int) -> CGFloat func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView
使用以上三种方法,我们可以覆盖单元格的宽度和高度以及每个单元格的视图。
在viewForRow方法中,我们可以通过创建自己的UILabel来定制UILabel,或者只创建任意随机的自定义视图,例如UIImage + UILabel。
要更改UIPickerView的背景颜色,只需在实例上使用backgroundColor属性。
在以下部分中,我们将首先创建带有自定义标签的UIPickerView。
稍后,我们将添加一个自定义视图来代替自定义标签。
项目情节提要
我们添加了两个UITextField并将它们连接到ViewController.swift文件中。
代码
下面给出了ViewController.swift文件的代码:
import UIKit
class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {
@IBOutlet weak var textField1: UITextField!
@IBOutlet weak var textField2: UITextField!
let picker1 = UIPickerView()
var arrayOfCountries = ["San Franceco","USA","Germany","China", "France","Japan", "Australia", "Greece"]
override func viewDidLoad() {
super.viewDidLoad()
//Do any additional setup after loading the view, typically from a nib.
createPickerView()
createToolbar()
}
func createPickerView()
{
picker1.delegate = self
picker1.delegate?.pickerView?(picker1, didSelectRow: 0, inComponent: 0)
textField1.inputView = picker1
textField2.inputView = picker1
picker1.backgroundColor = UIColor.brown
}
func createToolbar()
{
let toolbar = UIToolbar()
toolbar.sizeToFit()
toolbar.tintColor = UIColor.red
toolbar.backgroundColor = UIColor.blue
let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(ViewController.closePickerView))
toolbar.setItems([doneButton], animated: false)
toolbar.isUserInteractionEnabled = true
textField1.inputAccessoryView = toolbar
textField2.inputAccessoryView = toolbar
}
@objc func closePickerView()
{
view.endEditing(true)
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return arrayOfCountries.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
{
return arrayOfCountries[row]
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
textField1.text = arrayOfCountries[row]
}
func pickerView(_ pickerView: UIPickerView, widthForComponent component: Int) -> CGFloat {
return 100.0
}
func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
return 60.0
}
func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
var label:UILabel
if let v = view as? UILabel{
label = v
}
else{
label = UILabel()
}
label.textColor = UIColor.yellow
label.textAlignment = .left
label.font = UIFont(name: "Helvetica", size: 16)
label.text = arrayOfCountries[row]
return label
}
}
在viewForRow方法中,我们设置了UILabel颜色和系统字体。
我们必须在这里更新文本。
UIToolbar淡色在工具列上的按钮上设置。
在模拟器上运行上述应用程序时的输出为:
在下一部分中,我们将在第二个UITextField上创建一个动态UIPickerView。
我们将在自定义行中显示资产中的UIImage。
UIPickerView行与UIImage
更新的ViewController.swift文件的代码如下:
import UIKit
class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate, UITextFieldDelegate {
@IBOutlet weak var textField1: UITextField!
@IBOutlet weak var textField2: UITextField!
let picker1 = UIPickerView()
var arrayOfCountries = ["San Franceco","USA","Germany","China", "France","Japan", "Australia", "Greece"]
var arrayOfColors = ["Red","Orange","Yellow","Green", "Blue","Black"]
var activeTextField = 0
override func viewDidLoad() {
super.viewDidLoad()
//Do any additional setup after loading the view, typically from a nib.
textField1.delegate = self
textField2.delegate = self
createPickerView()
createToolbar()
}
func createPickerView()
{
picker1.delegate = self
picker1.delegate?.pickerView?(picker1, didSelectRow: 0, inComponent: 0)
textField1.inputView = picker1
textField2.inputView = picker1
picker1.backgroundColor = UIColor.brown
}
func createToolbar()
{
let toolbar = UIToolbar()
toolbar.sizeToFit()
toolbar.tintColor = UIColor.red
toolbar.backgroundColor = UIColor.blue
let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(ViewController.closePickerView))
toolbar.setItems([doneButton], animated: false)
toolbar.isUserInteractionEnabled = true
textField1.inputAccessoryView = toolbar
textField2.inputAccessoryView = toolbar
}
@objc func closePickerView()
{
view.endEditing(true)
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
switch activeTextField
{
case 1:
return arrayOfCountries.count
case 2:
return arrayOfColors.count
default:
return arrayOfColors.count
}
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?
{
switch activeTextField{
case 1:
return arrayOfCountries[row]
case 2:
return arrayOfColors[row]
default:
return arrayOfColors[row]
}
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
switch activeTextField{
case 1:
textField1.text = arrayOfCountries[row]
break
case 2:
textField2.text = arrayOfColors[row]
break
default:
textField1.text = arrayOfCountries[row]
break
}
}
func pickerView(_ pickerView: UIPickerView, widthForComponent component: Int) -> CGFloat {
return 100.0
}
func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
return 60.0
}
func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
switch activeTextField{
case 1:
var label:UILabel
if let v = view as? UILabel{
label = v
}
else{
label = UILabel()
}
label.textColor = UIColor.yellow
label.textAlignment = .left
label.font = UIFont(name: "Helvetica", size: 16)
label.text = arrayOfCountries[row]
return label
case 2:
let parentView = UIView()
let label = UILabel(frame: CGRect(x: 60, y: 0, width: 80, height: 50))
let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 50, height:50))
imageView.image = UIImage(named: "ic_launcher")
label.text = arrayOfColors[row]
parentView.addSubview(label)
parentView.addSubview(imageView)
return parentView
default:
return UILabel()
}
}
func textFieldDidBeginEditing(_ textField: UITextField) {
switch textField {
case textField1:
activeTextField = 1
picker1.reloadAllComponents()
case textField2:
activeTextField = 2
picker1.reloadAllComponents()
default:
activeTextField = 0
}
}
}
在上面的代码中,我们还添加了TextFieldDelegate Procol,以检测聚焦于哪个UITextField。
基于此,我们将显示相关的UIPickerView及其相应的数据。
在textFieldDidBeginEditing方法中,我们根据所关注的UITextField将activeField属性设置为1或者2。
之后,我们通过调用reloadAllComponents()更新UIPickerView。

