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
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
670
Source Editor Extensionと SwiftSyntaxでコード自動生成ツール を作る
kazuhiro4949
2
5k
iOS 12サポート終了で使えるAPIおさらい
kazuhiro4949
2
410
Source Editor ExtensionとSwiftSyntaxでコード自動生成
kazuhiro4949
0
140
大企業の最前線でコードを書き続けるためにやってきたこと
kazuhiro4949
27
19k
10分で振り返るここ数年のWWDCの技術トレンド
kazuhiro4949
0
360
コードを書きながら同時に設計していくためのiOSアプリ開発方針
kazuhiro4949
6
2.7k
身近な技術的課題から始めるOSSプロジェクト
kazuhiro4949
0
370
Featured
See All Featured
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
530
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
Are puppies a ranking factor?
jonoalderson
2
4.1k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
2
360
SEO for Brand Visibility & Recognition
aleyda
0
4.8k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
630
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
320
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
890
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
520
The Curious Case for Waylosing
cassininazir
1
570
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