Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
UIControlとUIKeyInputでUIPickerViewを 手軽に下からシュッと出す
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
kazuhiro4949
May 25, 2017
560
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
UIControlとUIKeyInputでUIPickerViewを 手軽に下からシュッと出す
kazuhiro4949
May 25, 2017
More Decks by kazuhiro4949
See All by kazuhiro4949
SwiftUIをUIKitのライフサイクルで拡張するTips
kazuhiro4949
4
2.9k
iOS15でプッシュ通知のテストが大変だった話
kazuhiro4949
0
650
Source Editor Extensionと SwiftSyntaxでコード自動生成ツール を作る
kazuhiro4949
2
4.8k
iOS 12サポート終了で使えるAPIおさらい
kazuhiro4949
2
390
Source Editor ExtensionとSwiftSyntaxでコード自動生成
kazuhiro4949
0
130
大企業の最前線でコードを書き続けるためにやってきたこと
kazuhiro4949
28
19k
10分で振り返るここ数年のWWDCの技術トレンド
kazuhiro4949
0
350
コードを書きながら同時に設計していくためのiOSアプリ開発方針
kazuhiro4949
6
2.7k
身近な技術的課題から始めるOSSプロジェクト
kazuhiro4949
0
350
Featured
See All Featured
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
The Cult of Friendly URLs
andyhume
79
6.9k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
340
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.4k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
310
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
380
Building the Perfect Custom Keyboard
takai
2
800
Marketing to machines
jonoalderson
1
5.5k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.5k
Transcript
6*$POUSPMͱ6*,FZ*OQVUͰ 6*1JDLFS7JFXΛ खܰʹԼ͔Βγϡοͱग़͢ ,B[VIJSP)":"4)* J04-5
6*1JDLFS7JFXΈ͍ͨͳೖྗ༻6*ΛԼ͔Βग़࣌ͬͯ͢ Ͳ͜ʹஔ͍ͯ·͔͢ʁ
w "DUJPO4IFFU w ಠࣗͷ6*ʁ w 6*5FYU'JFMEͷJOQVU7JFX
w "DUJPO4IFFU w ಠࣗͷ6*ʁ w 6*5FYU'JFMEͷJOQVU7JFX
w "DUJPO4IFFU w ಠࣗͷ6*ʁ w 6*5FYU'JFMEͷJOQVU7JFX
ʔ ຊདྷͷ͍ํͰͳ͍ ʔ ࡞Δͷ໘ ʔ 5FYU'JFME෦͍Βͳ͍ w "DUJPO4IFFU w
ಠࣗͷ6*ʁ w 6*5FYU'JFMEͷJOQVU7JFX
ࣗ࡞7JFXͰ ΧελϜιϑτΣΞΩʔϘʔυ ΛݺΔΑ͏ʹ͢Δͷ͕ ָͰΧελϚΠζੑߴ͠
࡞Γํ
6*$POUSPMΛܧঝ͢Δ λονΛड͚औΔೖྗ༻Ϋϥεͱͯ͠ศརͳͷͰ͍·͢ class PickerKeyboard: UIControl { private var textStore: String
= "" }
6*,FZ*OQVUΛܧঝ͢Δ 6*,FZ*OQVUΛܧঝͨ͠ΫϥεΛ͏ͱࣗ༝ʹιϑτΣΞ ΩʔϘʔυ͕දࣔͤ͞ΒΕ·͢ extension PickerKeyboard: UIKeyInput { var hasText: Bool
{ return !textStore.isEmpty } func insertText(_ text: String) { textStore += text setNeedsDisplay() } func deleteBackward() { textStore.remove( at: textStore.characters.index( before: textStore.characters.endIndex)) setNeedsDisplay() } }
6*,FZ*OQVUΛܧঝ͢Δ 6*,FZ*OQVUΛܧঝͨ͠ΫϥεΛ͏ͱࣗ༝ʹιϑτΣΞ ΩʔϘʔυ͕දࣔͤ͞ΒΕ·͢ extension PickerKeyboard: UIKeyInput { var hasText: Bool
{ return !textStore.isEmpty } func insertText(_ text: String) { textStore += text setNeedsDisplay() } func deleteBackward() { textStore.remove( at: textStore.characters.index( before: textStore.characters.endIndex)) setNeedsDisplay() } } ͜ͷ̏ͭΛ࣮͢Εେৎ
6*,FZ*OQVUΛܧঝ͢Δ 6*,FZ*OQVUΛܧঝͨ͠ΫϥεΛ͏ͱࣗ༝ʹιϑτΣΞ ΩʔϘʔυ͕දࣔͤ͞ΒΕ·͢ extension PickerKeyboard: UIKeyInput { var hasText: Bool
{ return !textStore.isEmpty } func insertText(_ text: String) { textStore += text setNeedsDisplay() } func deleteBackward() { textStore.remove( at: textStore.characters.index( before: textStore.characters.endIndex)) setNeedsDisplay() } }
λοϓͰ7JFXΛ'JSTU3FTQPOEFSʹ͢Δ ઌఔͷΫϥε͕'JSTU3FTQPOEFSʹͳΔͱιϑτΣΞΩʔ Ϙʔυ͕ग़͖ͯ·͢ class PickerKeyboard: UIControl { required init?(coder aDecoder:
NSCoder) { super.init(coder: aDecoder) addTarget(self, action: #selector(PickerKeyboard.didTap(sender:)), for: .touchUpInside) } func didTap(sender: PickerKeyboard) { becomeFirstResponder() } override var canBecomeFirstResponder: Bool { return true } }
λοϓͰ7JFXΛ'JSTU3FTQPOEFSʹ͢Δ ઌఔͷΫϥε͕'JSTU3FTQPOEFSʹͳΔͱιϑτΣΞΩʔ Ϙʔυ͕ग़͖ͯ·͢ class PickerKeyboard: UIControl { required init?(coder aDecoder:
NSCoder) { super.init(coder: aDecoder) addTarget(self, action: #selector(PickerKeyboard.didTap(sender:)), for: .touchUpInside) } func didTap(sender: PickerKeyboard) { becomeFirstResponder() } override var canBecomeFirstResponder: Bool { return true } }
λοϓͰ7JFXΛ'JSTU3FTQPOEFSʹ͢Δ ઌఔͷΫϥε͕'JSTU3FTQPOEFSʹͳΔͱιϑτΣΞΩʔ Ϙʔυ͕ग़͖ͯ·͢ class PickerKeyboard: UIControl { required init?(coder aDecoder:
NSCoder) { super.init(coder: aDecoder) addTarget(self, action: #selector(PickerKeyboard.didTap(sender:)), for: .touchUpInside) } func didTap(sender: PickerKeyboard) { becomeFirstResponder() } override var canBecomeFirstResponder: Bool { return true } }
λοϓͰ7JFXΛ'JSTU3FTQPOEFSʹ͢Δ ઌఔͷΫϥε͕'JSTU3FTQPOEFSʹͳΔͱιϑτΣΞΩʔ Ϙʔυ͕ग़͖ͯ·͢ class PickerKeyboard: UIControl { required init?(coder aDecoder:
NSCoder) { super.init(coder: aDecoder) addTarget(self, action: #selector(PickerKeyboard.didTap(sender:)), for: .touchUpInside) } func didTap(sender: PickerKeyboard) { becomeFirstResponder() } override var canBecomeFirstResponder: Bool { return true } }
6*3FTQPOEFSͷJOQVU7JFX ͱͯ͠6*1JDLFS7JFXΛฦ͢ JOQVU7JFX͕ฦ͢7JFXɺιϑτΣΞΩʔϘʔυͷΘΓ ͱͯ͠දࣔ͞Ε·͢ class PickerKeyboard: UIControl { override var
inputView: UIView? { let pickerView = UIPickerView() pickerView.delegate = self let row = data.index(of: textStore) ?? -1 pickerView.selectRow(row, inComponent: 0, animated: false) return pickerView } }
6*3FTQPOEFSͷJOQVU7JFX ͱͯ͠6*1JDLFS7JFXΛฦ͢ JOQVU7JFX͕ฦ͢7JFXɺιϑτΣΞΩʔϘʔυͷΘΓ ͱͯ͠දࣔ͞Ε·͢ class PickerKeyboard: UIControl { override var
inputView: UIView? { let pickerView = UIPickerView() pickerView.delegate = self let row = data.index(of: textStore) ?? -1 pickerView.selectRow(row, inComponent: 0, animated: false) return pickerView } }
6*3FTQPOEFSͷJOQVU7JFX ͱͯ͠6*1JDLFS7JFXΛฦ͢ JOQVU7JFX͕ฦ͢7JFXɺιϑτΣΞΩʔϘʔυͷΘΓ ͱͯ͠දࣔ͞Ε·͢ class PickerKeyboard: UIControl { override var
inputView: UIView? { let pickerView = UIPickerView() pickerView.delegate = self let row = data.index(of: textStore) ?? -1 pickerView.selectRow(row, inComponent: 0, animated: false) return pickerView } }
6*1JDLFS7JFXͷ %FMFHBUF %BUB4PVSDFΛ࣮ class PickerKeyboard: UIControl { var data: [String]
= ["Mon.", "Tue.", "Wed.", "Thu.", "Fri.", "Sut.", "Sun."] // .. } extension PickerKeyboard: UIPickerViewDelegate, UIPickerViewDataSource { func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return data.count } func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return data[row] } func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { textStore = data[row] setNeedsDisplay() } }
6*1JDLFS7JFXͷ %FMFHBUF %BUB4PVSDFΛ࣮ class PickerKeyboard: UIControl { var data: [String]
= ["Mon.", "Tue.", "Wed.", "Thu.", "Fri.", "Sut.", "Sun."] // .. } extension PickerKeyboard: UIPickerViewDelegate, UIPickerViewDataSource { func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return data.count } func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return data[row] } func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { textStore = data[row] setNeedsDisplay() } } આ໌লུ ཁ͢Δʹ6*1JDLFS7JFXΛී௨ʹ࣮͍ͯͩ͘͠͞
JOQVU"DDFTTPSZ7JFXʹด͡ΔϘλ ϯΛஔ͢Δ 6*3FTQPOEFSͷJOQVU"DDFTTPSZ7JFX ΩʔϘʔυͷ্ʹ͍ͬͭͯ͘͘Δҙͷ7JFXΛฦͤ·͢ class PickerKeyboard: UIControl { // ..
func didTapDone(sender: UIButton) { resignFirstResponder() } override var inputAccessoryView: UIView? { let button = UIButton(type: .system) // .. button.addTarget(self, action: #selector(PickerKeyboard.didTap(sender:)), for: .touchUpInside) let view = UIView(frame: CGRect(x: 0, y: 0, width: self.bounds.width, height: 44)) // .. view.addSubview(button) return view } }
JOQVU"DDFTTPSZ7JFXʹด͡ΔϘλ ϯΛஔ͢Δ 6*3FTQPOEFSͷJOQVU"DDFTTPSZ7JFX ΩʔϘʔυͷ্ʹ͍ͬͭͯ͘͘Δҙͷ7JFXΛฦͤ·͢ class PickerKeyboard: UIControl { // ..
func didTapDone(sender: UIButton) { resignFirstResponder() } override var inputAccessoryView: UIView? { let button = UIButton(type: .system) // .. button.addTarget(self, action: #selector(PickerKeyboard.didTap(sender:)), for: .touchUpInside) let view = UIView(frame: CGRect(x: 0, y: 0, width: self.bounds.width, height: 44)) // .. view.addSubview(button) return view } }
JOQVU"DDFTTPSZ7JFXʹด͡ΔϘλ ϯΛஔ͢Δ 6*3FTQPOEFSͷJOQVU"DDFTTPSZ7JFX ΩʔϘʔυͷ্ʹ͍ͬͭͯ͘͘Δҙͷ7JFXΛฦͤ·͢ class PickerKeyboard: UIControl { // ..
func didTapDone(sender: UIButton) { resignFirstResponder() } override var inputAccessoryView: UIView? { let button = UIButton(type: .system) // .. button.addTarget(self, action: #selector(PickerKeyboard.didTap(sender:)), for: .touchUpInside) let view = UIView(frame: CGRect(x: 0, y: 0, width: self.bounds.width, height: 44)) // .. view.addSubview(button) return view } }
σϞ
·ͱΊ w 6*,FZ*OQVUΛܧঝ͢ΔͱιϑτΣΞΩʔϘʔ υΛΧελϚΠζͨ͠7JFX͕ग़ͤΔ w 6*1JDLFS7JFX͜ΕͰग़͢ͷ͕Ұ൪ͬ͘͠Γ͘ Δؾ͕͢Δ
ࢀߟࢿྉ w ࠓॻ͍ͨίʔυͷશମ w IUUQTHJTUHJUIVCDPNLB[VIJSPEBDEFEEGGFF w ݩهࣄʮ6*$POUSPMͱ6*,FZ*OQVUͰ6*1JDLFS7JFXΛखܰʹԼ͔Βγϡοͱग़͢2JJUBʯ w IUUQRJJUBDPNLB[VIJSPJUFNTEGDBC w
6*,FZ*OQVUͷϦϑΝϨϯε w IUUQTEFWFMPQFSBQQMFDPNSFGFSFODFVJLJUVJLFZJOQVU