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
660
Source Editor Extensionと SwiftSyntaxでコード自動生成ツール を作る
kazuhiro4949
2
4.9k
iOS 12サポート終了で使えるAPIおさらい
kazuhiro4949
2
400
Source Editor ExtensionとSwiftSyntaxでコード自動生成
kazuhiro4949
0
140
大企業の最前線でコードを書き続けるためにやってきたこと
kazuhiro4949
28
19k
10分で振り返るここ数年のWWDCの技術トレンド
kazuhiro4949
0
350
コードを書きながら同時に設計していくためのiOSアプリ開発方針
kazuhiro4949
6
2.7k
身近な技術的課題から始めるOSSプロジェクト
kazuhiro4949
0
360
Featured
See All Featured
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Music & Morning Musume
bryan
47
7.3k
GitHub's CSS Performance
jonrohan
1033
470k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
350
YesSQL, Process and Tooling at Scale
rocio
174
15k
Fireside Chat
paigeccino
42
4k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
Evolving SEO for Evolving Search Engines
ryanjones
0
260
Scaling GitHub
holman
464
140k
Git: the NoSQL Database
bkeepers
PRO
432
67k
Chasing Engaging Ingredients in Design
codingconduct
0
280
Designing for humans not robots
tammielis
254
26k
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