Slide 1

Slide 1 text

J04ҎԼͰ%BSL.PEFʹରԠͨ͠஍ࠈͷ࿩ !GSPNLLJ04%$BC !1

Slide 2

Slide 2 text

1SPpMF struct Profile { let name = "Kazuya Ueoka” let nickname = "͔ͬ͘Μ" let twitter = "@fromkk" let github = "fromkk" let qiita = "fromkk" let company = "Timers Inc." } • 2

Slide 3

Slide 3 text

%BSL.PEF❓ 3

Slide 4

Slide 4 text

%BSL.PEF 4

Slide 5

Slide 5 text

88%$ͰJ04޲͚ʹ%BSL.PEF͕ൃද !5

Slide 6

Slide 6 text

%BSL.PEFͱ͸ʁ w ҉͍എܠʹ໌Δ͍ςΩετ΍ίϯςϯπΛදࣔ͢ΔΧϥʔεΩʔϜͷࣄ w ίϯτϥετൺΛ໨ࢦ͢ w ໨΍όοςϦʔʹ༏͍͠ͱ͞Ε͍ͯΔ w ໷ؒʹ໌Δ͍ը໘ݟͨ͘ͳ͍ w J04Ͱ͸Ϟʔυຖʹ֤৭ ηϚϯςΟοΫΧϥʔ ͷඍௐ੔͕ߦΘΕ ͍ͯΔ w 4'4ZNCPMT͸ͲͷϞʔυͰ΋Α͘ݟ͑Δ༷ʹͳ͍ͬͯΔ !6 IUUQTEFWFMPQFSBQQMFDPNEFTJHOIVNBOJOUFSGBDFHVJEFMJOFTBDDFTTJCJMJUZPWFSWJFXDPMPSBOEDPOUSBTU

Slide 7

Slide 7 text

5JQTίϯτϥετൺ !7 Ҿ༻IUUQTHJUIVCDPNFNBSMFZ$PMPS$POUSBTU

Slide 8

Slide 8 text

!8

Slide 9

Slide 9 text

J04ҎԼͰ΋%BSL.PEF͍ͨ͠ !9

Slide 10

Slide 10 text

# Typeʹ΋Dark ModeೖΕͯΈͨ IUUQTUZQFNBSLEPXOBQQ

Slide 11

Slide 11 text

%BSL.PEFΛ࣮૷͢Δҝͷߟ͑ํ !11

Slide 12

Slide 12 text

৭Λ੔ཧ͢Δ ৭ʹ໾ׂ΍ҙຯΛ෇༩͢Δ !12 protocol ColorSetType { static var theme: UIColor { get } static var action: UIColor { get } static var placeholder: UIColor { get } static var backgroundColor: UIColor { get } static var share: UIColor { get } static var archive: UIColor { get } static var error: UIColor { get } } %BSL.PEFΛ࣮૷͢Δҝͷߟ͑ํ

Slide 13

Slide 13 text

6*ͷΠϕϯτΛड͚औΔ !13 %BSL.PEFΛ࣮૷͢Δҝͷߟ͑ํ

Slide 14

Slide 14 text

ΞϓϦશମͰ؅ཧ͍ͯ͠Δ৭Λมߋ͢Δ !14 class App { static var colorSet: ColorSetType = DefaultColorSet() } if modeSwitch.isOn { app.colorSet = DarkColorSet() } else { app.colorSet = DefaultColorSet() } %BSL.PEFΛ࣮૷͢Δҝͷߟ͑ํ

Slide 15

Slide 15 text

Ϟʔυ͕มߋ͞ΕͨࣄΛݕ஌ͯ͠6*ʹ൓өͤ͞Δ !15 %BSL.PEFΛ࣮૷͢Δҝͷߟ͑ํ "QQ 7JFX" 7JFX# 7JFX$ 7JFX%

Slide 16

Slide 16 text

Ϟʔυ͕มߋ͞ΕͨࣄΛݕ஌ͯ͠6*ʹ൓өͤ͞Δ !16 %BSL.PEFΛ࣮૷͢Δҝͷߟ͑ํ "QQ 7JFX" 7JFX# 7JFX$ 7JFX%

Slide 17

Slide 17 text

IUUQTHJUIVCDPNGSPNLL $PMPS4FU ৭ͷछྨ͕มߋ͞ΕͨࣄΛײ஌ͯ͠ 6*ʹ৭Λઃఆ͢ΔࣄΛ؆ૉԽग़དྷΔ ϥΠϒϥϦ TVCTDSJCFͱCJOEΛ࢖͍෼͚Ε͹ ͋Δఔ౓ॊೈʹ !17 $PMPS4FU

Slide 18

Slide 18 text

ελʔ͍ͩ͘͞ !18 $PMPS4FU IUUQTHJUIVCDPNGSPNLL $PMPS4FU ৭ͷछྨ͕มߋ͞ΕͨࣄΛײ஌ͯ͠ 6*ʹ৭Λઃఆ͢ΔࣄΛ؆ૉԽग़དྷΔ ϥΠϒϥϦ TVCTDSJCFͱCJOEΛ࢖͍෼͚Ε͹ ͋Δఔ౓ॊೈʹ

Slide 19

Slide 19 text

ରԠํ๏͸େମ෼͔ͬͨ% !19

Slide 20

Slide 20 text

࣮ࡍͷϓϩμΫτʹద༻ͯ͠ΈΑ͏ !20

Slide 21

Slide 21 text

஍ࠈͷ࢝·Γ !21

Slide 22

Slide 22 text

ݩʑͷը໘ !22

Slide 23

Slide 23 text

৭͚ͩΛมߋͯ͠Έͨ !23

Slide 24

Slide 24 text

·ͣ৭Λมߋͯ͠Έͨ ヤバそう !24

Slide 25

Slide 25 text

ͱΓ͋͑ͣഎܠ৭ઃఆ !25

Slide 26

Slide 26 text

ͱΓ͋͑ͣഎܠ৭ઃఆ なるほど? !26

Slide 27

Slide 27 text

৭ʑௐ੔ͯ͠ΈΔ !27

Slide 28

Slide 28 text

͍ͩͿྑ͘ͳ͖ͬͯͨʁ !28

Slide 29

Slide 29 text

残念でした !29

Slide 30

Slide 30 text

画像も対応しないと !30

Slide 31

Slide 31 text

Α͠Α͠ !31

Slide 32

Slide 32 text

͜Ε͕ !32

Slide 33

Slide 33 text

こうじゃ !33

Slide 34

Slide 34 text

ΞΠίϯͷ༷ͳը૾͸UJOU$PMPSͷมߋͰରԠ !34

Slide 35

Slide 35 text

ステータスバーも変えたい !35

Slide 36

Slide 36 text

͍͍͍͍ͧͧ !36

Slide 37

Slide 37 text

ରॲํ๏ !37

Slide 38

Slide 38 text

ରॲํ๏ view.backgroundColor = .white *#΍ίʔυͰͷ৭ͷ௚઀ࢦఆېࢭ) ⬇ TypeColorSet.backgroundColorLight .bind(to: view, keyPath: \.backgroundColor) .append(to: observationBag) !38

Slide 39

Slide 39 text

ରॲํ๏ AppearanceͷઃఆͰࡁΉ৔߹͸Ұׅઃఆ͕खͬऔΓૣ͍ TypeColorSet.backgroundColorLight .bind(to: UITableViewCell.appearance(), keyPath: \.backgroundColor) .append(to: observationBag) !39

Slide 40

Slide 40 text

ରॲํ๏ എܠ͕ന΍طଘͷ৭Λલఏͱ͍ͯ͠Δը૾͕͋Ε͹ࠩ͠ସ͑Δ !40

Slide 41

Slide 41 text

ରॲํ๏ !41 TypeColorSet.theme.subscribe { [weak button] _ in let colorSet = UIColor.currentColorSet() switch colorSet.identifier { case .default: button?.setImage(#imageLiteral(resourceName: “bt_add_light"), for: .normal) case .dark: button?.setImage(#imageLiteral(resourceName: "bt_add_dark"), for: .normal) } }.append(to: observationBag) ࠩ͠ସ͑ग़དྷͳ͍ը૾͸ΠϕϯτϋϯυϦϯάͰରԠ

Slide 42

Slide 42 text

ରॲํ๏ let imageView = UIImageView(image: UIImage(named: "image")) ⬇ let imageView = UIImageView(image: UIImage(named: “image")? .withRenderingMode(.alwaysTemplate)) TypeColorSet.theme.bind(
 to: imageView, keyPath: \.tintColor
 ).append(to: observationBag) ΞΠίϯͷ༷ͳҰ৭ͷը૾͸tintColorΛઃఆ͢Ε͹৭͕มΘΔ༷ʹରॲ !42

Slide 43

Slide 43 text

ରॲํ๏ εςʔλεόʔ͸Ϟʔυ͕มߋ͞Εͨ࣌ʹߋ৽͢ΔΑ͏ʹ TypeColorSet.theme.subscribe { [weak self] _ in self?.setNeedsStatusBarAppearanceUpdate() }.append(to: observationBag) override var preferredStatusBarStyle: UIStatusBarStyle { switch UIColor.currentColorSet().identifier { case .default: return .default case .dark: return .lightContent } } !43

Slide 44

Slide 44 text

·ͱΊ w ࢥͬͨΑΓରԠ͕େม w ΋ͱ΋ͱഎܠ৭͕നͷΞϓϦͩͱͲ͜ʹഎܠ৭ࢦఆ͔͕ͨ͠
 ෼͔ΓͮΒ͍ ‎എܠ৭Λҙࣝͯ͠ઃఆ͢Δͷ͕େࣄ w ॎ΍ԣɺ4QMJU7JFXͳͲ༷ʑͳը໘ͷ֬ೝඞཁ ‎શը໘໢ཏͷ6*ςετͱεΫϦʔϯγϣοτ͕ٻΊΒΕΔ !44

Slide 45

Slide 45 text

13 45

Slide 46

Slide 46 text

• αʔόʔαΠυΤϯδχΞ (PHP, Golang, AWS) • AndroidΤϯδχΞ (Kotlin) • iOSΤϯδχΞ (Swift) TimersͰ͸ݱࡏΤϯδχΞશ৬छ࠾༻தʂ
 ৄ͘͠͸”Timers”Ͱݕࡧ ! 46

Slide 47

Slide 47 text

ϦδΣΫτίϯ΍Γ·͢ !47 %BZ %BZ

Slide 48

Slide 48 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠. 48