「ゴルトン社長」のはじめの一歩

すげーブログ

世の中のすげーを伝える!

【iphoneアプリ開発_初心者必見】UIPickerViewの基礎・基本

UIPickerViewの基礎・基本

  • 生年月日や情報を簡単に選択できる
  • ドラムロールは汎用性が高いので,ぜひ参考になればと思います

人気の記事!

人生を変えたい人に向けて「はじめの一歩」を踏み出したい人にオススメ!

www.goruton.com www.goruton.com www.goruton.com www.goruton.com

1)ドラムロールを作ってみよう
2)日付を選んでみよう
3)日付クラスに関して

1) ドラムロールを作ってみよう

  • UI部品からPicker Viewを選択し,MainStoryBoardに配置しよう

ViewController.swift

import UIKit

class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource{
    
    //部品の接続
    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var pickerView: UIPickerView!
    
    let dataList = [
        "本田","山葉","鈴木","川崎"
    ]
    
    // UIPickerViewの列の数
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    // UIPickerViewの行数(リストの数)
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return dataList.count
    }
    
    // UIPickerViewの最初の表示
    func pickerView(_ pickerView: UIPickerView,
                    titleForRow row: Int,
                    forComponent component: Int) -> String? {
        
        return dataList[row]
    }
    // UIPickerViewのRowが選択された時の挙動
    func pickerView(_ pickerView: UIPickerView,didSelectRow row: Int,inComponent component: Int) {
        //ラベルの文字を変更
        label.text = dataList[row]
        
    }

    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Delegate設定
        pickerView.delegate = self
        pickerView.dataSource = self
        
        // ViewContorller 背景色
        self.view.backgroundColor = UIColor(red: 0.12, green: 1.0, blue: 0.94, alpha: 1.0)
        // PickerView のサイズと位置
        pickerView.frame = CGRect(x: 0, y: 0, width: self.view.frame.width, height: 300)
        pickerView.backgroundColor = UIColor(red: 0.69, green: 0.93, blue: 0.9, alpha: 1.0)
        
        // PickerViewはスクリーンの中央に設定
        pickerView.center = self.view.center
        // Label 位置はPickerViewより150上に設定、高さを2行表示分とる
        let yPosition = pickerView.frame.origin.y
        label.frame = CGRect(x: 0, y: yPosition - 100, width: self.view.frame.width, height: 100)
        
        // ラベルを2行表示
        label.numberOfLines = 2
        label.text = "バイクの\n販売メーカー"
        
        // フォントサイズを大きく
        label.font = UIFont.systemFont(ofSize: 36)
        // テキストを中央寄せにする
        label.textAlignment = NSTextAlignment.center
        
    }
}

2)日付を選んでみよう

  • UI部品から Date Picker を選択し,MainStoryBoardに配置しよう
    f:id:BlueThree:20190622094230p:plain:h300:w300
    MainStoryBoard

ViewController

import UIKit

class ViewController: UIViewController{
    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var Picker: UIDatePicker!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let calendar = Calendar.current
        let date = Date()
        
        // let today = calendar.startOfDay(for:date) 日付の始まり(当日の午前0時0分0秒)を取得
        
        /*Dateが今日か、明日か、昨日か、週末かを判別できます。
        let isToday = Calendar.current.isDateInToday(date)
        let isTomorrow = Calendar.current.isDateInTomorrow(date)
        let isYesterday = Calendar.current.isDateInYesterday(date)
        let isWeekend = Calendar.current.isDateInWeekend(date)
        */
        //let am = calendar.amSymbol(date)
        
        let tomorrow = calendar.date(byAdding: .day,value: 1, to: calendar.startOfDay(for:date))
        label.text = "\(String(describing: tomorrow))"
        
    }
    @IBAction func GetDate(_ sender: Any) {
        label.text = "\(Picker.date)"
        
    }
    
}


class DatePickerKeyboard: UITextField {
    private var datePicker: UIDatePicker!
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commoninit()
    }
    override init(frame: CGRect) {
        super.init(frame: frame)
        commoninit()
    }
    
    private func commoninit() {
        // datePickerの設定
        datePicker = UIDatePicker()
        datePicker.date = Date()
        datePicker.locale = Locale(identifier: "ja") //日本語に変更
        datePicker.addTarget(self, action: #selector(setText), for: .valueChanged)
        
        //datePicker.datePickerMode = .date
       
        // textFieldのtextに日付を表示する
        setText()
        inputView = datePicker
        inputAccessoryView = createToolbar() //アクセサリービューを読み込む
    }
    
    // キーボードのアクセサリービューを作成する
    private func createToolbar() -> UIToolbar {
        let toolbar = UIToolbar()
        toolbar.frame = CGRect(x: 0, y: 0, width: self.frame.width, height: 44)
        let space = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: self, action: nil)
        space.width = 12
        let flexSpaceItem = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil)
        let todayButtonItem = UIBarButtonItem(title: "今日", style: .done, target: self, action: #selector(todayPicker))
        let doneButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(donePicker))
        
        let toolbarItems = [flexSpaceItem, todayButtonItem, doneButtonItem, space]
        toolbar.setItems(toolbarItems, animated: true)
        
        return toolbar
    }
    
    // キーボードの完了ボタンタップ時に呼ばれる
    @objc private func donePicker() {
        resignFirstResponder()

    }
    // キーボードの今日ボタンタップ時に呼ばれる
    @objc private func todayPicker() {
        datePicker.date = Date()
        setText()
    }
    
    // datePickerの日付けをtextFieldのtextに反映させる
    @objc private func setText() {
        let f = DateFormatter()
        f.dateStyle = .long
        f.locale = Locale(identifier: "ja")
        text = f.string(from: datePicker.date)
        
    }
    
    // クラス外から日付を取り出すためのメソッド
    func getDate() -> Date {
        return datePicker.date
    }
    
    // コピペ等禁止
    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        return false
    }
    // 選択禁止
    /*override func selectionRects(for range: UITextRange) -> [Any] {
        return []
    }*/
    // カーソル非表示
    override func caretRect(for position: UITextPosition) -> CGRect {
        return CGRect(x: 0, y: 0, width: 0, height: 0)
    }
}

NextViewController

import UIKit

class NextViewController: UIViewController{

    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var label2: UILabel!
    @IBOutlet weak var label3: UILabel!
    @IBOutlet weak var label4: UILabel!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let date0 = NSDate() //日付
        label.text = format(date: date0 as Date)
        let date1 = NSDate(timeInterval: 60*60*24*7, since: date0 as Date) //1週間後
        let date2 = NSDate(timeInterval: -60*60*24*7, since: date0 as Date) //1週間前
        let span = date1.timeIntervalSince(date2 as Date) // 1209600秒差
        let daySpan = span/60/60/24 // 14 (日)
        label2.text = String(daySpan) //日付差
        let isSameDay = Calendar.current.isDate(date1 as Date, inSameDayAs: date2 as Date) //同じ日付か判定
        
        let calendar = Calendar(identifier: .gregorian) // 西暦指定(和暦は.japanese)
        let date = calendar.date(from: DateComponents(year: 2016, month: 10, day: 1))
        // -> 2016年10月1日 0時0分
        let ad = calendar.date(byAdding: DateComponents(hour: 1, minute: 1), to: date!)
        // -> 2016年10月1日 1時1分
        label3.text = "\(String(describing: ad))" //date()をStringにして文章にする
        // 差の取得
        let sa = calendar.dateComponents([.day],from: date1 as Date, to: date2 as Date)
        
        label4.text = "\(String(describing: sa))"
    }
    
    func format(date:Date)->String{
        let format = DateFormatter() //フォーマット準備
        format.dateFormat = "yyyy年MM月dd日" //フォーマットの様式指定
        let strDate = format.string(from: date as Date) //フォーマットに日付のデータを入れる
        return strDate
    }
}
  • DatePickerKeyboardを参考にコードを書いてみよう
  • UITextField のサブクラスを作成
  • UIDatePicker 以外でUITextField の値を変更させたくない
  • キーボード入力時のカーソルやコピペ用UIを以下のコマンドを用いて無効
    • canPerformAction
    • selectionRects
    • caretRect
  • datePicker.addTarget(self, action: #selector(setText), for: .valueChanged) を初期化時に起動
    • UIDatePicker で日付を変更するたびにUITextField の値を変更させるため
  • ツールバーの「今日」ボタンを押下した時にdatePicker.date にDate() を設定
    • ピッカーの値を現在日時に変更

3)日付クラスに関して

  • 下記記事に詳しく説明しています

https://bluethree-gift.hatenablog.com/entry/2019/06/18/001939bluethree-gift.hatenablog.com

参考リンク

最後に!!

f:id:BlueThree:20200805191056j:plain:w500

最後までご覧いただき、本当にありがとうございます!!

最近は、たくさんの読者さんから「コメント」や「メッセージ」が届くようになりました!!
皆さんと会話できて嬉しいですし、コメントで毎日励まされています。

ありがとうございます!

これからも、ゴルトン社長は「毎日」ブログを更新しています! www.goruton.com www.goruton.com www.goruton.com www.goruton.com www.goruton.com

皆さんから人気がある記事

www.goruton.com www.goruton.com www.goruton.com www.goruton.com www.goruton.com

まとめ記事

www.goruton.com www.goruton.com www.goruton.com www.goruton.com www.goruton.com www.goruton.com www.goruton.com