Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
UIControlとUIKeyInputでUIPickerViewを 手軽に下からシュッと出す
Search
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
A Soul's Torment
seathinner
7
3.6k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
Building Applications with DynamoDB
mza
96
7.2k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
230
Making Projects Easy
brettharned
120
6.7k
Why You Should Never Use an ORM
jnunemaker
PRO
61
10k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Building an army of robots
kneath
306
46k
New Earth Scene 8
popppiees
3
2.6k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
What does AI have to do with Human Rights?
axbom
PRO
1
2.4k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
520
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