Slide 1

Slide 1 text

4XJGUରԠ͠Α͏ͱͨ͠Β େมͳ໨ʹૺͬͨ࿩ for iOSDC Japan 2017

Slide 2

Slide 2 text

ΤϞ͍࿩ ࠓ೔͸ ˞4XJGUͷݴޠ࢓༷ͷ࿩͸͋Γ·ͤΜɻ

Slide 3

Slide 3 text

override init() { super.init() emplyedBy = "MAGES. 5pb. Game div" job = "iOS Developer" twitter = "@lovee" qiita = "@lovee" github = "el-hoshino" additionalInfo = "དྷ݄స৬͠·͢ʘ(^o^)ʗ" class Speaker: Developer { } }

Slide 4

Slide 4 text

4XJGUରԠɺ
 ͍ͯ͠·͔͢ʁ

Slide 5

Slide 5 text

ࢲ͸88%$௚ޙ͔Β
 ͍ͯ͠·͢ʂ

Slide 6

Slide 6 text

ˠ ˠ ˠ     ☠

Slide 7

Slide 7 text

ௐࢠʹ৐ͬͯ
 ͠·ͬͨ

Slide 8

Slide 8 text

ຊ೔ͷ ओ໾

Slide 9

Slide 9 text

1MPU 3FWJFX "QQMJDBUJPO 7JB %BUBJOQVU "TTJTUBOU

Slide 10

Slide 10 text

13"7%" "%7ήʔϜγφϦΦ
 ϨϏϡʔΞϓϦ༻
 ϑϨʔϜϫʔΫ

Slide 11

Slide 11 text

13"7%" νϟϓλʔϑϩʔͰ ಡΈ͍ͨষΛબͿ

Slide 12

Slide 12 text

13"7%" ͦͷষͷ࠷ॳͷ
 γφϦΦϑΝΠϧΛ ಡΉ

Slide 13

Slide 13 text

13"7%" ηϦϑʹධՁΛ ͚ͭΔ

Slide 14

Slide 14 text

13"7%" ͜ͷϑΝΠϧࣗମٴͼ
 ͜ͷϑΝΠϧʹ
 ొ৔ͨ͠ΩϟϥΛධՁ

Slide 15

Slide 15 text

13"7%" ࣍ͷϑΝΠϧ΁ ਐΉ

Slide 16

Slide 16 text

13"7%" ষ຤Ͱ͜ͷষͷ ײ૝Λ࢒͢

Slide 17

Slide 17 text

13"7%" ৽͍͠νϟϓλʔ͕ ղআ͞Εɺ
 νϟϓλʔϑϩʔ΁

Slide 18

Slide 18 text

13"7%" UITableView
 UIPageView UISlider UIPanGestureRecognizer FUDʜ

Slide 19

Slide 19 text

13"7%"։ൃ࣌αϚϦʔ ▸ ։ൃ։࢝࣌ɿ4XJGU຤ظ ▸ ౰࣌ґଘ؀ڥɿࣗ࡞ϑϨʔϜϫʔΫ&MUBTP ݩڟͦͷҰ ݩڟͦͷೋ

Slide 20

Slide 20 text

13"7%"։ൃ౰ॳͷεΩϧ͸ະख़ͩͬͨ ▸ J04։ൃʹͦͦ͜͜׳Ε͖ͯ࢝Ίͨࠒ ▸ ઃܭʹؾΛ഑Γ࢝Ί͕ͨܦݧઙ͔ͬͨͨΊ·ͩ؁͔ͬͨ ▸ σʔλϑϩʔ͕ෳࡶͰಈ࡞Λ௥͍ʹ͔ͬͨ͘ ▸ ʮڞ௨ͷઃఆ͔ͩΒΈΜͳ࢖͏ʯͱ͍͏୯७ͳཧ༝Ͱ4JOHMFUPOΛ࢖͍΍ ͕ͬͨ ▸ ͱΓ͋͑ͣ4XJGUʹ্͛ͯΈͨΒ΄ͱΜͲमਖ਼͍Βͣ ▸ ͔͔ͤͬͩ͘ΒؾʹͳͬͨϙΠϯτ௚ͦ͏ͱࢥͬͨ ▸ ্هͷઃܭͷ؁͞Ͱେ෯ͳॻ͖׵͑Λڧ͍ΒΕͨ

Slide 21

Slide 21 text

13"7%"։ൃ࣌αϚϦʔ ▸ ։ൃ։࢝࣌ɿ4XJGU຤ظ ▸ ౰࣌ґଘ؀ڥɿࣗ࡞ϑϨʔϜϫʔΫ&MUBTP ݩڟͦͷҰ ݩڟͦͷೋ

Slide 22

Slide 22 text

&MUBTPͱ͸Կ͔ ▸ 4XJGUʹ͋Γͦ͏Ͱͳ͔ͬͨ৭ΜͳศརͳػೳΛ੝ΓࠐΜͩ൚༻ϑϨʔϜϫʔΫ ▸ CGPointಉ࢜ͳͲͷ଍͠ࢉҾ͖ࢉ ▸ ܾ·ͬͨൣғ಺ͷཚ਺ੜ੒Int.makeRandom(within: 0 ..< 10) ▸ ഑ྻͷγϟοϑϧ[1, 2, 3, 4, 5].shuffled ▸ ͳͲͳͲʜ ▸ ࠷ॳ͸ϋοΧιϯͷ࣌ͷίʔσΟϯάޮ཰ͷͨΊʹ࡞ͬͨ ▸ ࡞ͬͯΔ͏ͪʹʮ࣮຿ʹ΋ศར͡ΌͶʯͱࢥͬͯ࢖͍࢝Ίͨ IUUQTHJUIVCDPNFMIPTIJOP&MUBTP

Slide 23

Slide 23 text

&MUBTPͷԿ͕มΘ͔ͬͨ ▸ ͿͬͪΌ͚࡞ͬͨ౰ॳ͸Կ΋ਂ͘ߟ͑ͣʹػೳ੝ΓࠐΜͰͨ ▸ 4XJGUˠͷ࣌ͷίʔυमਖ਼͚ͩͰେมͩͬͨͷͰͦΕʹઐ೦ͨ͠ ▸ 4XJGUˠͷࠓ͸ίʔυमਖ਼΄΅ͳ͔ͬͨͷͰʮ༨ܭʯͳ͜ͱߟ͑࢝Ίͨ ▸ ͜ͷ"1*ઃܭ͸ຊ౰ʹެࣜΨΠυϥΠϯʹଇͬͯΔ͔Ͳ͏͔ ▸ ͜Ε͸ຊ౰ʹ&MUBTPʹೖΕΔ΂͖ػೳ͔ʢಠཱͤ͞Δ΂͖͔ʣ ▸ 5BSHFUFE&YUFOTJPOTͷಋೖʢxxx.rx.doSth()Έ͍ͨͳॻ͖ํʣ ▸ ࢖͍ํ͕ΨϥϦͱมΘͬͯ&MUBTPґଘͷϓϩδΣΫτ͕େมͳ͜ͱʹ IUUQTHJUIVCDPNFMIPTIJOP&MUBTP

Slide 24

Slide 24 text

/PU"VUP-BZPVUΛ৽ͨʹಋೖͨ͠ ▸ ౰ॳ΋શͯͷϨΠΞ΢τ͸ίʔυϕʔεͩͬͨ ▸ ϨΠΞ΢τ͸શͯlayoutSubviews()ͷoverrideͰରԠͨ͠ ▸ ೝ͕ࣝ଍Γͣɺ௚઀layoutSubviews()Λݺͼग़͢Օॴ΋͋ͬͨ ▸ ࢠϏϡʔΛϓϩύςΟʔͱͯ͠อ࣋͢Δඞཁ͕͋ͬͨ ▸ ผͷϓϩδΣΫτͷ੍࡞࣌ʹ/PU"VUP-BZPVUΛ࡞ͬͨ ▸ layoutSubviews()Λඞͣ͠΋override͢Δඞཁ͕ͳ͘ͳͬͨ ▸ ࢠϏϡʔͷϨΠΞ΢τΛ਌ϏϡʔͷϓϩύςΟʔͱͯ͠อ࣋Ͱ͖ΔͨΊ
 ࢠϏϡʔࣗମΛϓϩύςΟʔͱͯ͠อ࣋͢Δඞཁ͕ͳ͘ͳͬͨ ▸ ʲએ఻ʳචऀݱࡏͷϝΠϯ044ϓϩδΣΫτʂ IUUQTHJUIVCDPNFMIPTIJOP/PU"VUP-BZPVU

Slide 25

Slide 25 text

݁Ռɿ ຆͲॻ͖׵͑ʹ

Slide 26

Slide 26 text

FlowContentControllerʢچʣ fileprivate lazy var chapterButtons: [FlowChapterButton] = { let chapters = GlobalSettings.shared.chapterMetas let buttons = chapters.enumerated().map { (i, chapterMeta) -> FlowChapterButton in let button = FlowChapterButton(meta: chapterMeta) button.setOnTappedAction({ [weak self] _ in self?.didSelectChapter(i) }) return button } return buttons }()

Slide 27

Slide 27 text

FlowContentControllerʢ৽ʣ private lazy var chapterButtons: [FlowChapterButton] = { let chapters = self.model.getChapters(for: self) let buttons = chapters.map { (chapter) -> FlowChapterButton in let button = self.makeButton(for: chapter) return button } return buttons }()

Slide 28

Slide 28 text

FlowControllerʢچʣ override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. do { let controller = self.flowContentController controller.delegate = self controller.dataSource = self.dataSource self.addChildViewController(controller) self.flowView.contentView = controller.view controller.didMove(toParentViewController: self) } do { let controller = self.pageHeaderController controller.setHeaderTitleString("νϟϓλʔબ୒") self.addChildViewController(controller) self.flowView.header = controller.view controller.didMove(toParentViewController: self) } }

Slide 29

Slide 29 text

FlowControllerʢ৽ʣ override func viewDidLoad() { super.viewDidLoad() self.setupContentController() self.setupHeaderController() }

Slide 30

Slide 30 text

ScenarioModelʢ৽چࠩ෼ʣ

Slide 31

Slide 31 text

➡ େมͩͬͨ ͚Ͳ ಡΈ΍͢͞ େ෯ʹ㽉

Slide 32

Slide 32 text

ͱࢥͬͨΒࠓ౓͸ J1IPOF9ͷొ৔ͩ

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

Ͱ΋ؤுͬͯ೔Ͱ
 /PU"VUP-BZPVUΛ
 TBGF"SFB*OTFUTʹ
 ରԠͤͨ͞

Slide 35

Slide 35 text

No content

Slide 36

Slide 36 text

چ ৽

Slide 37

Slide 37 text

ʲએ఻ʳ
 /PU"VUP-BZPVU
 ޷ධެ։தʂ IUUQTHJUIVCDPNFMIPTIJOP/PU"VUP-BZPVU

Slide 38

Slide 38 text

ڭ܇ͦͷҰ ▸ 4JOHMFUPO͸͖ͪΜͱ࢖͏΂͖͔Λߟ͔͑ͯΒ࢖͑ ▸ ʮΠϯελϯε͕Ұݸ͔͠ͳ͍ʯ͸4JOHMFUPOΛ࢖͏ཧ༝ʹͳΒͳ͍ ▸ ʮΈΜͳڞ௨ͯ͠࢖͏ʯ΋4JOHMFUPOΛ࢖͏ཧ༝ʹͳΒͳ͍ ▸ ʮ୭΋͍ͭ͜ʹ੹೚Λ࣋ͯΔʹ஌Γਚ͘͢͜ͱ͕ڐ͞ΕΔʯ΋ͷ͚ͩ 4JOHMFUPOΛ࢖͍͍ͬͯ

Slide 39

Slide 39 text

ڭ܇ͦͷೋ ▸ ઃܭ͸͖ͪΜͱอक͢Δ࣌ͷࣗ෼Λߟ͑ͯઃܭ͠Ζ ▸ ѱ͍ઃܭ͸ॻ͘ͱ͖͸ศར͔΋͠Εͳ͍͕อक࣌ʹࢮ͵ ▸ อक࣌ʹͦͷѱ͍ઃܭΛ໨ʹ͢ΔͱͦΕΛॻ͍ͨࣗ෼ΛͿΜԥΓͨ͘ͳΔ ▸ Ͱ΋·͔͋ͱݴͬͯͿͬͪΌ͚ͦΕ͸ࣗ෼ͷεΩϧʹґଘ͢Δ΋ͷ͔ͩΒ ࠓ͸͖ͪΜͱͨͭ͠΋ΓͰ΋ଟ෼೥ޙͷอक࣌ʹྺ࢙͸܁Γฦ͢ ▸ ͦΕͰ΋ͦΕ͸εΩϧΞοϓͷূڌ͔ͩΒڪΕͣʹ੒௕͠·͠ΐ͏

Slide 40

Slide 40 text

ڭ܇ͦͷࡾ ▸ 'SBNFXPSLͷଟ༻͸ґଘੑ͕େมͳ͜ͱʹͳΔ ▸ ࢖͍࢝Ίͨͱ͖͸͔֬ʹศར͚ͩͲґଘ͢Δ'SBNFXPSL͕૿͑Δͱ
 ͦͷ෼͚ͩґଘؔ܎΋૿͑Δ ▸ 'SBNFXPSLʹมߋ͕͋Δͱ࢖ͬͯΔϓϩδΣΫτͷमਖ਼΋༨ّͳ͘͞ΕΔ ▸ 'SBNFXPSLΛࣗ࡞͢ΔͱϓϩάϥϜઃܭʹ͍ͭͯΑΓਂ͘ߟ͑ͤͯ͘͞ΕΔ ▸ 'SBNFXPSL͸ͦΕΛར༻͢ΔશͯͷϓϩδΣΫτʹӨڹΛٴ΅͢ͷͰ "1*ͷઃܭʹ͸ͱͯ΋ؾΛ͚ͭΔඞཁ͕͋Δ

Slide 41

Slide 41 text

ॳ৺ऀ΁ͷΞυόΠε ▸ ͱʹ͔͕͘Ή͠ΌΒʹ͍ͬͺ͍ॻ͖·͠ΐ͏ɻ ▸ Կ΋ߟ͑ͣʹॻ͘ͷͰ͸ͳ͘ɺྫ͑)PX͕ཧղͰ͖ͳͯ͘΋ɺ8IBUͱ8IZ Λཧղ͢Δ౒ྗΛ͠·͠ΐ͏ɻ ▸ ΍Γ͍ͨ͜ͱ͕Ͱ͖͔ͨΒͬͯࢥߟఀࢭͤͣɺΑΓྑ͍ॻ͖ํ͕ͳ͍͔΋ߟ͑· ͠ΐ͏ɻ ▸ ͍ͬͺ͍นʹͿ͔ͭͬͯઃܭʹ͍ͭͯͷཧղΛਂΊ·͠ΐ͏ɻ ▸ 2JJUB΍5FSB5BJM΋ྑ͍Ͱ͕͢ɺެࣜυΩϡϝϯτ΋ͪΌΜͱಡΈ·͠ΐ͏ɻ ▸ ൒೥લͷࣗ෼͕ॻ͍ͨίʔυ͕ΫιͩͱࢥΘͳ͔ͬͨΒ੒௕͕ࢭ·ͬͨূڌʂ

Slide 42

Slide 42 text

͋Γ͕ͱ͏
 ͍͟͝·ͨ͠ʂ