Skip to content

Instantly share code, notes, and snippets.

@KentarouKanno
Last active June 23, 2018 10:35
Show Gist options
  • Save KentarouKanno/db1f38f9c92aa5698b6196997cbae003 to your computer and use it in GitHub Desktop.
Save KentarouKanno/db1f38f9c92aa5698b6196997cbae003 to your computer and use it in GitHub Desktop.
UIPickerView

UIPickerView

★ PickerViewの選択している線を消す(以下の処理はタイミングも重要、レイアウトが決まる前に実行するとクラッシュする)
※ iOS7以降はshowsSelectionIndicatorが動かないのでその対応

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    
    if picker.subviews.count >= 3 {
        picker.subviews[1].isHidden = true
        picker.subviews[2].isHidden = true
    }
}

★ 3列のPickerViewを作成する

import UIKit

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
    
    @IBOutlet weak var pickerView: UIPickerView!
    
    var array1 = ["AAA","BBB","CCC","DDD","EEE","FFF","GGG"]
    var array2 = ["0","1","2","3","4","5","6","7","8"]
    var array3 = ["6/25","6/26","6/27","6/28","6/29","6/30","7/1"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }
    
    // 表示列
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 3
    }
    
    // 表示行
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        switch component {
        case 0 : return array1.count
        case 1 : return array2.count
        case 2 : return array3.count
        default: return 0
        }
    }
    
    // 各ラベルの幅
    func pickerView(_ pickerView: UIPickerView, widthForComponent component: Int) -> CGFloat {
        let screenWidth = UIScreen.main.bounds.size.width
        
        switch component {
        case 0 : return screenWidth * 0.35
        case 1 : return screenWidth * 0.2
        case 2 : return screenWidth * 0.45
        default: return 0
        }
    }
    
    //表示内容
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        switch component {
        case 0 : return array1[row]
        case 1 : return array2[row]
        case 2 : return array3[row]
        default: return nil
        }
    }
    
    //選択時
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        print("列: \(component)")
        print("値: \(row)")
    }
}
import UIKit

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
    
    @IBOutlet weak var myPicker: UIPickerView!
    
    var array1 = ["AAA", "BBB", "CCC", "DDD", "EEE", "FFF", "GGG"]
    var array2 = ["0", "1", "2", "3", "4", "5", "6", "7", "8"]
    var array3 = ["6/25", "6/26", "6/27", "6/28", "6/29", "6/30", "7/1"]
    var dataArray: Array<Array<String>>!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        dataArray = [array1, array2, array3]
    }
    
    // 表示列
    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        return 3
    }
    
    // 表示行
    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return dataArray[component].count
    }
    
    // 各ラベルの幅
    func pickerView(pickerView: UIPickerView, widthForComponent component: Int) -> CGFloat {
        let screenWidth = UIScreen.mainScreen().bounds.size.width
        
        switch component {
        case 0 : return screenWidth * 0.35
        case 1 : return screenWidth * 0.2
        case 2 : return screenWidth * 0.45
        default: return 0
        }
    }
    
    //表示内容
    func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return dataArray[component][row]
    }
    
    //選択時
    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        print("列: \(row) 値: \(dataArray[component][row])")
    }
}

★ カスタムViewを生成してPickerに表示する

import UIKit

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

    @IBOutlet weak var pickerView: UIPickerView!
    var dataArray = ["Font 1","Font 2","Font 3"]
    var fontArray = ["Zapfino","DBLCDTempBlack","MarkerFelt-Thin"]

    override func viewDidLoad() {
        super.viewDidLoad()

        pickerView.delegate = self
        pickerView.dataSource = self
    }

    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        return 1
    }

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return dataArray.count
    }

    func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView {

        // 表示するラベルを生成する
        let label = UILabel(frame: CGRect(x: 0, y: 0, width: UIScreen.mainScreen().bounds.size.width, height: 50))
        label.textAlignment = .Center
        label.text = dataArray[row]
        label.font = UIFont(name: fontArray[row],size:16)
        return label
    }

    // Picker選択時
    func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        print("value : \(dataArray[row])")
    }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment