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
iPhoneX対応とScrollViewのcontentInset
Search
kNagadou
April 03, 2018
Programming
1
720
iPhoneX対応とScrollViewのcontentInset
ROPPONGI.swift #2 の発表用スライドです。
kNagadou
April 03, 2018
Tweet
Share
More Decks by kNagadou
See All by kNagadou
勇気を出して、Appleにバグレポートを出してみませんか?
knagadou
0
1.2k
Musicアプリのトランジションを再現する
knagadou
3
2.6k
テスト実行時に 不要な初期化コードを実行しないようにする
knagadou
4
1.5k
Other Decks in Programming
See All in Programming
今こそ知るべき耐量子計算機暗号(PQC)入門 / PQC: What You Need to Know Now
mackey0225
3
190
Navigation 3: 적응형 UI를 위한 앱 탐색
fornewid
1
530
ELYZA_Findy AI Engineering Summit登壇資料_AIコーディング時代に「ちゃんと」やること_toB LLMプロダクト開発舞台裏_20251216
elyza
2
970
CSC307 Lecture 03
javiergs
PRO
1
470
AI 駆動開発ライフサイクル(AI-DLC):ソフトウェアエンジニアリングの再構築 / AI-DLC Introduction
kanamasa
11
5k
GoLab2025 Recap
kuro_kurorrr
0
2.3k
16年目のピクシブ百科事典を支える最新の技術基盤 / The Modern Tech Stack Powering Pixiv Encyclopedia in its 16th Year
ahuglajbclajep
2
450
例外処理とどう使い分ける?Result型を使ったエラー設計 #burikaigi
kajitack
16
4.6k
Context is King? 〜Verifiability時代とコンテキスト設計 / Beyond "Context is King"
rkaga
10
1.5k
AI時代を生き抜く 新卒エンジニアの生きる道
coconala_engineer
1
520
Graviton と Nitro と私
maroon1st
0
160
Vibe codingでおすすめの言語と開発手法
uyuki234
0
160
Featured
See All Featured
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
How to Talk to Developers About Accessibility
jct
1
94
Scaling GitHub
holman
464
140k
Practical Orchestrator
shlominoach
190
11k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
270
Paper Plane
katiecoart
PRO
0
45k
First, design no harm
axbom
PRO
1
1.1k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
82
HDC tutorial
michielstock
1
300
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
76
Test your architecture with Archunit
thirion
1
2.1k
Transcript
J1IPOF9ରԠͱ 6*4DSPMM7JFXͷDPOUFOU*OTFU ,":"$ٕज़෦ ,B[VNBTB/"("%0 30110/(*TXJGU
w ,B[VNBTB/"("%0 w ,":"$d w 5XJUUFS!L[NTOHE w ʢʣ/1$+ϑΟδʔΫϊʔϏε DNҎԼΫϥεग़༧ఆ w
IUUQTOQDKKQDPOUFTUOFXHFOFSBUJPODMBTTJD 1SPpMF
2ݮྔதʹ৯ͯྑ͍ͷʁ ͓ण࢘ ύελྉཧ ͓ʹ͗Γ εΠʔπ ࠓ͔Βग़དྷΔݮྔΫΠζ
"શ෦0, ʢ˞ઁऔ͢ΔλΠϛϯάɺຊؾʹΑΔʣ ࠓ͔Βग़དྷΔݮྔΫΠζ
2ͲͷτϨʔχϯά͕ےΛେ͖͘Ͱ͖Δʁ ϕϯνϓϨεLHYճ ϕϯνϓϨεLHYճ ࠓ͔Βग़དྷΔےංେΫΠζ
"ͲͪΒےංେ͢Δ ʢ˞ݶք·Ͱ͍ࠐΉ͜ͱ͕લఏʣ ࠓ͔Βग़དྷΔےංେΫΠζ
ϓϥίϨ8FEEJOH IUUQTQMBDPMFXFEEJOH %SFTTZCZϓϥίϨ IUUQTESFTTZQMBDPMFXFEEJOH ϓϥίϨ
ˎ8FC൛ IUUQTXFCMPCJDP ˎJ5VOFT"QQ4UPSF IUUQTJUVOFTBQQMFDPNKQBQQMPCJϩϏʔJE NU ˎ"OESPJE IUUQTQMBZHPPHMFDPNTUPSFBQQTEFUBJMT JEDPNLBZBDOBLBNBQIMKB
ήʔϜ߈ུνϟοτ4/4 -PCJ
6QEBUFGPSJ1IPOF9
#VJMEXJUIJ044%, 9DPEFY
J1IPOF9ͷσΟεϓϨΠରԠ 4BGF"SFBରԠ ˠ6*4DSPMM7JFXͷදࣔྖҬ͕͓͔͍͠ɻௐ্͕ख͘Ͱ͖ͳ͍ɻ 6*4DSPMM7JFXͷ"VUP-BZPVUͱDPOUFOU*OTFUʹ͍͓ͭͯ͞Β͍ͯ͠ΈΔɻ
6*4DSPMM7JFX 6*5BCMF7JFX ͷ"VUP-BZPVUͰࠔΔ࣌ 6*/BWJHBUJPO#BS 6*4FBSDI#BS 6*5BCMF7JFX
DPOUFOU*OTFUͱ 6*4DSPMM7JFXͷGSBNF DPOUFOU*OTFUUPQ
DPOUFOU*OTFUͱ 6*4DSPMM7JFXͷGSBNF DPOUFOU*OTFUUPQ 6*4DSPMM7JFXίϯςϯπपลʹ ઃఆͰ͖Δ༨നͷ͜ͱ
6*4DSPMM7JFX 6*5BCMF7JFX ͷ"VUP-BZPVUͰࠔΔ࣌
6*4DSPMM7JFX 6*5BCMF7JFX ͷ"VUP-BZPVUͰࠔΔ࣌ Ṗͷεϖʔε
6*4DSPMM7JFX 6*5BCMF7JFX ͷ"VUP-BZPVUͰࠔΔ࣌ ͜͜ಉ͡Α͏ʹݟ͑Δ͕ɺ 6*5BCMF7JFX͕ը໘͍ͬͺ͍ʹ දࣔ͞Ε͍ͯͳ͍͜ͱ͕͔Δ
6*4DSPMM7JFX 6*5BCMF7JFX ͷ"VUP-BZPVUͰࠔΔ࣌ 6*4FBSDI#BSͷΈ্ʹҠಈ ͯ͠͠·͍ɺṖͷεϖʔε͕ൃੜ
DPOTUBOU 6*/BWJHBUJPO#BS 6*4FBSDI#BSͷߴ͞ Ͱ 6*5BCMF7JFXͷUPQʹ੍Λ͔͚͍ͯΔɻ ˠ6*4FBSDI#BSͱ6*5BCMF7JFXͷίϯςϯπͷؒʹ
ෆࣗવͳ伱͕ؒੜ·Εͯ͠·͏ɻ ˠ6*4FBSDI#BSͷڍಈɺ6*5BCMF7JFX͕ ը໘͍ͬͺ͍ʹදࣔ͞Ε͍ͯΔ͜ͱΛظ͍ͯ͠Δɻ 6*4DSPMM7JFX 6*5BCMF7JFX ͷ"VUP-BZPVUͰࠔΔ࣌
Ξϯνύλʔϯ ɾϔομʔʢϑολʔʣͳͲͷߴ͞ʹ߹Θͤͯɺ6*4DSPMM7JFXʹ"VUP -BZPVUΛ͔͚ͯ͠·͏ɻ ɾ$IJME7JFX$POUSPMMFS͔Β1BSFOU7JFX$POUSPMMFSͷ7JFXϑϨʔϜ Λࢀরͯ͠ɺ6*4DSPMM7JFXʹ"VUP-BZPVUΛ͔͚ͯ͠·͏ɻ
w ඪ४ͷ6* 6*4FBSDI#BSͳͲ Ճͨ࣌͠ʹɺෆࣗવͳ6*දࣔʹͳΔɻ w ϔομʔϑολʔͳͲʹ#MVSޮՌΛ͚͍ͨ࣌ʹࠔΔɻ w 1BSFOU7JFX$POUSPMMFSͱ$IJME7JFX$POUSPMMFSͷґଘੑ͕ߴ·Δʢϝϯ ςφϯε͠ਏ͍ʣɻ
ࠔΔ͜ͱ·ͱΊ
"QQMFͷΨΠυϥΠϯʹԊ͏Α͏ʹ 6*4DSPMM7JFXΛ࣮͢Δ IUUQTEFWFMPQFSBQQMFDPNKQEPDVNFOUBUJPO6*4DSPMM7JFX@QHQEG
6*4DSPMM7JFXը໘͍ͬͺ͍ʹදࣔ͢Δ self.tableView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ self.tableView.topAnchor.constraint(equalTo: self.view.topAnchor), self.tableView.bottomAnchor.constraint(equalTo:
self.view.bottomAnchor), self.tableView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor), self.tableView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor) ]) ˠϔομʔϑολʔͷߴ͞ʹ߹Θͤͯ6*4DSPMM7JFX ͷαΠζΛௐͨ͠Γ͠ͳ͍Α͏ʹ͢Δɻ
σϑΥϧτͰBEKVTUFE$POUFOU*OTFU͕༗ޮʹͳ͍ͬͯΔͨΊɺಛʹ DPOUFOU*OTFUͷௐෆཁɻ ˠBEKVTUFE$POUFOU*OTFUʹΑΓɺDPOUFOU*OTFU͕4BGF"SFBʹ߹ Θͤͯࣗಈௐ͞ΕΔɻ DPOUFOU*OTFUͷௐ J04
DPOUFOU*OTFUͷௐ J04 1BSFOU7JFX$POUSPMMFSͰཧ͍ͯ͠Δ7JFXͷϑϨʔϜʢϔομʔϑο λʔͳͲʣΛ$IJME7JFX$POUSPMMFSʹ͍ͨ͠߹ɻ ˠBEEJUJPOBM4BGF"SFB*OTFUΛ͏ɻ ˠϔομʔʢϑολʔʣͷϑϨʔϜͷ༨നΛ $IJME7JFX$POUSPMMFSͰཧ͢Δ7JFXͷTBGF"SFB*OTFUTʹ͢͜ͱ ͕Ͱ͖Δɻ
@available(iOS 11.0, *) override func viewSafeAreaInsetsDidChange() { super.viewSafeAreaInsetsDidChange() let childVCAdditionalSafeAreaInsets = UIEdgeInsetsMake(self.childVCAdditionalSafeAreaInsetsTop, 0, 0, 0) self.childVC.additionalSafeAreaInsets = childVCAdditionalSafeAreaInsets }
͠ɺBEKVTUFE$POUFOU*OTFUΛΘͳ͍ TDSPMM7JFXDPOUFOU*OTFU"EKVTUNFOU#FIBWJPSOFWFS ͱ͢Δ߹ɻ ˠWJFX%JE-BZPVU4VCWJFXT ͰɺTDSPMM7JFXDPOUFOU*OTFUΛௐɻ DPOUFOU*OTFUͷௐ J04 override
func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() if #available(iOS 11.0, *) { self.tableView.contentInset = UIEdgeInsetsMake(self.view.safeAreaInsets.top, 0, self.view.safeAreaInsets.bottom, 0) self.tableView.scrollIndicatorInsets = self.tableView.contentInset } }
ʮBEKVTUFE$POUFOU*OTFUΛΘͳ͍߹ʯͱ΄΅ಉ͡ɻ ˠWJFX%JE-BZPVU4VCWJFXT ͷλΠϛϯάͰUPQ-BZPVU(VJEF CPUUPN-BZPVU(VJEFͷͱɺૠೖ͍ͨ͠JOTFUΛͯ͠ TDSPMM7JFXDPOUFOU*OTFUΛௐɻ ˠૠೖ͍ͨ͠JOTFUɺ7JFX$POUSPMMFSͷੜ࣌ʹ͢ɻ DPOUFOU*OTFUͷௐ
J04Ҏલ override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() if #available(iOS 11.0, *) { } else { self.topLayoutMarginConstraint.constant = 0 self.tableView.contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length, 0, self.bottomLayoutGuide.length, 0) self.tableView.scrollIndicatorInsets = self.tableView.contentInset } }
DPOUFOU*OTFUͷௐ J04Ҏલ // ChildViewController @available(iOS, deprecated: 11.0, message:
"iOS11.0Ҏ߱ additionalSafeAreaInsets Ͱௐ͢Δɻ") private var additionalScrollViewContentInsetTop: CGFloat = 0.0 init(additionalScrollViewContentInsetTop: CGFloat) { self.additionalScrollViewContentInsetTop = additionalScrollViewContentInsetTop super.init(nibName: nil, bundle: nil) } ~~~ override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() if #available(iOS 11.0, *) { // do nothing } else { let contentInset = UIEdgeInsetsMake(self.topLayoutGuide.length + self.additionalScrollViewContentInsetTop, 0, self.bottomLayoutGuide.length, 0) self.scrollView.contentInset = contentInset self.scrollView.scrollIndicatorInsets = self.scrollView.contentInset } }
ࢀߟ <>4VCNJUUJOHJ04BQQTUPUIF"QQ4UPSF IUUQTEFWFMPQFSBQQMFDPNJPTTVCNJU <>6*4DSPMM7JFXBEKVTUFE$POUFOU*OTFU IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOVJLJUVJTDSPMMWJFX BEKVTUFEDPOUFOUJOTFU MBOHVBHFPCKD <>6*4DSPMM7JFXDPOUFOU*OTFU"EKVTUNFOU#FIBWJPS IUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOVJLJUVJTDSPMMWJFX DPOUFOUJOTFUBEKVTUNFOUCFIBWJPS
MBOHVBHFPCKD <>J046*4DSPMM7JFXϓϩάϥϛϯάΨΠυ IUUQTEFWFMPQFSBQQMFDPNKQEPDVNFOUBUJPO6*4DSPMM7JFX@QHQEG
͋Γ͕ͱ͏͍͟͝·ͨ͠