Slide 1

Slide 1 text

4IFUPNJ5SBDL$ "QQMF1FODJMରԠͷ צॴΛ࿩͠·͢

Slide 2

Slide 2 text

4IFUPNJ ࣯ ͠ͱΈ ʙۚ༥ܥγεςϜΤϯδχΞ ʙJ04ΤϯδχΞ Ԡԉ͍ͯ͠Δٿஂ͸౦๺ָఱΰʔϧσϯΠʔάϧε ˏTU2JJUB͸ͯͳOPUF ˏTJUXJUUFS(JUIVC

Slide 3

Slide 3 text

-JLF1BQFS͸ͲΜͳΞϓϦ͔ ͳ͔ͥͭͬͨ͘ 1FODJM,JUͱ͸ 1FODJM,JUͰͰ͖Δ͜ͱͰ͖ͳ͍͜ͱ 1,$BOWBT7JFXͱ1,%SBXJOH ࡾߦͰಋೖͰ͖Δ1,$BOWBT7JFX 1,%SBXJOHͷѻ͍ํ 1,5PPM1JDLFSͷσβΠϯ͸͋·ΓΧελϚΠζ͕ޮ͔ͳ͍ μʔΫϞʔυରԠͷ᠘ ແݶεΫϩʔϧ࢓༷ ʢ͓·͚ʣ"QQMF1FODJMରԠͷྺ࢙

Slide 4

Slide 4 text

-JLF1BQFS͸ͲΜͳΞϓϦ͔

Slide 5

Slide 5 text

ˡ"QQ4UPSFϦϯΫ͸ͪ͜Β͔Β

Slide 6

Slide 6 text

w ʮࢴͷΑ͏ʹඳ͚Δʯ͕ίϯηϓτͷϊʔτΞϓϦ w "QQMF1FODJM͔ΒͷೖྗΛલఏͱ͍ͯ͠Δ w ॻ͍ͨϊʔτ͸ڞ༗ػೳͰଞΞϓϦͱͷ࿈ܞ͕Մೳ

Slide 7

Slide 7 text

ʙ %-

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

w μ΢ϯϩʔυͷׂ̕Ҏ্͕ӳޠݍ ɹʢ͋Γ͕͍͚ͨͲɺΈΜͳͲ͔ͬΒݟ͚ͭͯΜͩʁʣ w ೔ຊͩͱ%-͘Β͍͔͠ͳ͍ˠӳޠରԠ͸͠·͠ΐ͏ʂʂʂʂ

Slide 10

Slide 10 text

ͳ͔ͥͭͬͨ͘

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

͋Εʁ ͳΜͰԶɺ J1BE1SP΋"QQMF1FODJM΋͋Μͷʹ ࢴʹखॻ͖ͯ͠Μͩʜʜʁ

Slide 14

Slide 14 text

Կ͔Λࢥ͍ͭ͘ˠࢴʹॻ͘ ˢͱͯ΋ࣗવ

Slide 15

Slide 15 text

Կ͔Λࢥ͍ͭ͘ˠJ1BEΛखʹͱΔ ˠ&WFSOPUFʢ͋Δ͍͸"QQMFͷϝϞΞϓϦʁʣΛ։͘ ˠϊʔτϒοΫΛબͿ ˠ৽ن࡞੒ΛબͿ ˠखॻ͖Ϟʔυʹ͢Δ ˠඳ͖࢝ΊΔ ˠʢλΠτϧΛܾΊΔɺͲͷϊʔτϒοΫʹೖΕΔ͔ʣ ˢͱͯ΋ΊΜͲ͍͘͞ʂʂʂʂʂʂʂʂʂʂʂʂʂ ʢͪͳΈʹݱࡏ͸&WFSOPUF͔Β/PUJPOʹ৐Γ͔͑ͯ·͢ʣ

Slide 16

Slide 16 text

ϋʔυ΢ΣΞͷ໰୊Ͱ͸ͳ͘ɺ ιϑτ΢ΣΞͷ໰୊Ͱ͸ʁ

Slide 17

Slide 17 text

ࣗ෼ͷཉ͍͠ΞϓϦ͸ ࣗ෼Ͱͭ͘Ζ͏ʂ

Slide 18

Slide 18 text

Ͱ΋"QQMF1FODJMରԠͬͯ Ͳ͏ͨ͠Β͑͑Μ΍ʜʜ

Slide 19

Slide 19 text

1FODJM,JU

Slide 20

Slide 20 text

1FODJM,JUͱ͸

Slide 21

Slide 21 text

w 88%$Ͱొ৔ͨ͠ϑϨʔϜϫʔΫ w "QQMF1FODJMPSࢦͰͷखॻ͖ೖྗΛ૝ఆͯͭ͘͠ΒΕ͍ͯΔ w ؆୯ʹ"QQMF७ਖ਼ͷϝϞΞϓϦ-JLFͳڍಈ͕࣮ݱͰ͖Δ w J04͔Β৽ػೳ͕௥Ճ͞ΕɺࠓҰ൪஫໨ΛूΊΔϥΠϒϥϦ ɹʢ৽ػೳʣɹ˞ຊηογϣϯͰ͸࣌ؒͷؔ܎Ͱѻ͑ͣ ɹ4DSJCCMFςΩετϑΟʔϧυʹखॻ͖ͰจࣈΛॻ͘ͱɺςΩετσʔλͱͯ͠ೝࣝ͞ΕΔ ɹ1,4USPLFखॻ͖ͷيಓ͕औಘͰ͖Δ

Slide 22

Slide 22 text

ࠓҰ൪஫໨ΛूΊΔϥΠϒϥϦ

Slide 23

Slide 23 text

1FODJM,JUͰ Ͱ͖Δ͜ͱͰ͖ͳ͍͜ͱ

Slide 24

Slide 24 text

Ͱ͖Δ͜ͱ w "QQMF७ਖ਼ͷϝϞΞϓϦͷ6*Λ࣮ݱ͢Δ w $BOWBT w 5PPM1JDLFSVOEPSFEP ϖϯফ͠ΰϜఆن ৭มߋ w 1,%SBXJOHͱ6**NBHF%BUBܕͷ૬ޓม׵Λ͢Δ w ࢦͱ"QQMF1FODJMͷλονΛࣝผ͢Δ ɹʢͨͩ͠BMMPXT'JOHFS%SBXJOH͕J04͔Β%FQSFDBUFEʹͳ͍ͬͯΔʣ w %FMFHBUFϝιουܦ༝ͰESBXJOHͷมߋɺ 5PPM1JDLFSͷ࢖༻ͷTUBSUFOEΛݕ஌͢Δ

Slide 25

Slide 25 text

Ͱ͖ͳ͍͜ͱ w 6*ͷΧελϚΠζ w 5PPM1JDLFS͸ Ͱݻఆ w "QQMF७ਖ਼ϝϞʹͳ͍ػೳͷ௥Ճ w ͨͱ͑͹ʮృΓ௵͕ͭ͘͠Γ͍ͨʯͱࢥͬͯ΋ɺ ɹ֦ுੑ͸ͳ͍ͷͰɺ׬શʹผݸͰͭ͘Δඞཁ͕͋Δ

Slide 26

Slide 26 text

1,$BOWBT7JFXͱ1,%SBXJOH

Slide 27

Slide 27 text

1,$BOWBT7JFX 1,%SBXJOH 1,%SBXJOH 1,%SBXJOH 7JFX .PEFM ϝΠϯ .drawingʹࢦఆ

Slide 28

Slide 28 text

1,$BOWBT7JFX 1,%SBXJOH 7JFX .PEFM πʔϧ 1,5PPM1JDLFS 1,%SBXJOH 1,%SBXJOH 1,*OLJOH5PPM PKToolPickerObserver (protocol) 1,&SBTFS5PPM 1,-BTTP5PPM 1,5PPM .selectedTool ˞1,$BOWBT7JFXͷAUPPMAʹ௚ࢦఆ΋Մ

Slide 29

Slide 29 text

ࡾߦͰಋೖͰ͖Δ1,$BOWBT7JFX

Slide 30

Slide 30 text

let canvas = PKCanvasView(frame: view.frame) view.addSubview(canvas) canvas.tool = PKInkingTool(.pen, color: .black, width: 30)

Slide 31

Slide 31 text

ͨͬͨ3ߦͷίʔυͰ PencilKit Λಋೖͯ͠ Apple Pencil ରԠ(https://qiita.com/niwasawa/items/d8e239cd23666c750a2f)

Slide 32

Slide 32 text

&BTZUPVTF

Slide 33

Slide 33 text

1,%SBXJOHͷѻ͍ํ

Slide 34

Slide 34 text

1,%SBXJOHͷجຊ w ಺෦ߏ଄͸Ṗ w 1,$BOWBT7JFXͷΠϯϓοτΞ΢τϓοτ͸શͯ1,%SBXJOHܕܦ༝ͱͳΔ w 6**NBHFʹϝιουҰൃͰม׵Մೳ ɹˠނʹଞΞϓϦͱͷڞ༗͸ҙ֎ͱָͩͬͨ w EBUB3FQSFTFOUBUJPO Ͱ%BUBܕʹҰൃͰม׵Մೳ w CPVOETΛ͍࣋ͬͯͯɺ$BOWBT7JFXͷαΠζͱ͸ผݸʹࣗ෼ͷαΠζΛ࣋ͭ

Slide 35

Slide 35 text

%BUBͰͦͷ··อଘ͢Δͷ͸ѱख w 1,%SBXJOH͕ෳ਺ʹͳΔͱɺ%BUBͩͱϝλσʔλΛѻ͍੾Εͳ͍ ʢFYʣॱংɺඳ͍ͨ೔࣌ɺछྨͳͲ w ެࣜαϯϓϧͩͱҰݸט·͍ͤͯͨͷͰɺͦΕʹͳΒͬͨ struct DataModel: Codable { /// Names of the drawing assets to be used to initialize the data model the first time. static let defaultDrawingNames: [String] = ["Notes"] /// The width used for drawing canvases. static let canvasWidth: CGFloat = 768 /// The drawings that make up the current data model. var drawings: [PKDrawing] = [] var signature = PKDrawing() }

Slide 36

Slide 36 text

J04ΞϓϦؒͳΒ1,%SBXJOH౉ͤΔʁ ʢະ֬ೝʣ w ݁ہڞ༗͢Δࡍ͸6**NBHFͰ࿈ܞ͍ͯ͠Δ w ΋͠ڞ༗ઌͷΞϓϦ΋1FODJM,JU࢖͍ͬͯͨΒɺ ɹ1,%SBXJOHΛ౉ͯ͠ɺڞ༗ઌͷΞϓϦͰฤूΛܧଓͰ͖Δʁ w 6*"DUJWJUZ7JFX$POUSPMMFSͷBDUJWJUZ*UFN͸"OZͳͷͰɺ ɹޓ͍ͷΞϓϦͷܕೝ͕ࣝ߹͍ͬͯΕ͹ड͚౉͠Ͱ͖ͦ͏ͳؾ͕͢Δ w ΋͠ࢼͨ͠ํ͕͍ͨΒ৘ใ͍ͩ͘͞ʂ

Slide 37

Slide 37 text

1,5PPM1JDLFSͷσβΠϯ͸ ͋·ΓΧελϚΠζ͕ޮ͔ͳ͍

Slide 38

Slide 38 text

1,5PPM1JDLFSͷઃఆྫ private func addPalette() { if let window = UIApplication.shared.windows.first, let toolPicker = PKToolPicker.shared(for: window) { self.toolPicker = toolPicker self.toolPicker.addObserver(canvasView) self.toolPicker.addObserver(self) canvasView.becomeFirstResponder() self.toolPicker.selectedTool = PKInkingTool(.pen, color: .black, width: 1) } }

Slide 39

Slide 39 text

μʔΫϞʔυରԠͷ᠘

Slide 40

Slide 40 text

No content

Slide 41

Slide 41 text

No content

Slide 42

Slide 42 text

w 1FODJM,JU͸J04͔Βొ৔ͨ͠ϑϨʔϜϫʔΫ w J04ͱ͍͑͹μʔΫϞʔυॳొ৔ w 1FODJM,JUࣗମ͕μʔΫϞʔυΛߟྀͯ͠ઃܭ͞Ε͍ͯΔ w ނʹಛʹࢦఆ͠ͳͯ͘΋ͳΜ্͔ख͍͜ͱ΍ͬͯ͘ΕΔ

Slide 43

Slide 43 text

͔͠͠໌ࣔతʹࢦఆ͍ͯ͠ͳ͍ͨΊɺ ։ൃऀͷҙਤ͠ͳ͍ڍಈʹͳΔʢͳͬͨʣ

Slide 44

Slide 44 text

ʂʁ

Slide 45

Slide 45 text

Կ͕ى͖ͨʁ w $PMMFDUJPO7JFXʹԼهͷΑ͏ʹϊʔτΛද͍ࣔͯͨ͠ let drawing = drawings[indexPath.row] let image = drawing.image(from: drawing.bounds, scale: 1.0) w දࣔޙʹϥΠτϞʔυμʔΫϞʔυͷ੾Γସ͕͑ى͜Δͱɺ ɹ৭൓స͕ߦ͑ͣɺݟ͑ͳ͘ͳͬͯ͠·͏

Slide 46

Slide 46 text

override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { if previousTraitCollection?.userInterfaceStyle != traitCollection.userInterfaceStyle { reload() } } w ରࡦˣ w ͳ͓ڞ༗ػೳͰόά͕·ͩ࢒͍ͬͯΔʜʜ w 1FODJM,JUʹμʔΫϞʔυରԠ͓೚ͤͰ͖ΔΑ͏Ͱ ɹ࣮͸΍Βͳ͖Ό͍͚ͳ͍͜ͱ͕͋Δ

Slide 47

Slide 47 text

ແݶεΫϩʔϧ࢓༷

Slide 48

Slide 48 text

஌ͬͯ·ͨ͠ʁ w "QQMFͷ७ਖ਼ϝϞ͸ॎํ޲ʹແݶεΫϩʔϧͰ͖Δ

Slide 49

Slide 49 text

1,$BOWBTΛແݶεΫϩʔϧՄʹ͢Δ canvasView.alwaysBounceVertical = true

Slide 50

Slide 50 text

// MARK: Canvas View Delegate /// Delegate method: Note that the drawing has changed. func canvasViewDrawingDidChange(_ canvasView: PKCanvasView) { hasModifiedDrawing = true updateContentSizeForDrawing() } /// Helper method to set a suitable content size for the canvas view. func updateContentSizeForDrawing() { // Update the content size to match the drawing. let drawing = canvasView.drawing let contentHeight: CGFloat // Adjust the content size to always be bigger than the drawing height. if !drawing.bounds.isNull { contentHeight = max(canvasView.bounds.height, (drawing.bounds.maxY + DrawingViewController.canvasOverscrollHeight) * canvasView.zoomScale) } else { contentHeight = canvasView.bounds.height } canvasView.contentSize = CGSize(width: DataModel.canvasWidth * canvasView.zoomScale, height: contentHeight) } ˞88%$ͷαϯϓϧΑΓ

Slide 51

Slide 51 text

ʢ͓·͚ʣ "QQMF1FODJMରԠͷྺ࢙

Slide 52

Slide 52 text

˞1FODJM,JUొ৔Ҏલ ʙJ046*,JUͷ6*5PVDIͰ৭ʑؤு͍ͬͯͨʁ J04ʙ6*1FODJM*OUFSBDUJPO &WFSOPUFͷखॻ͖7JFXˠ ʢ4LJUDI-JLFͳ΍ͭʣ ͸͓ͦΒ͘6*,JUͰؤுͬͨʁ

Slide 53

Slide 53 text

·ͱΊ

Slide 54

Slide 54 text

w 1FODJM,JUΛ࢖͏ͱ؆୯ʹ"QQMF1FODJMରԠ͕Ͱ͖Δ w ͨͩ͠"QQMF७ਖ਼ϝϞΞϓϦͷ࢓༷͔ΒΧελϚΠζੑ͸͞΄Ͳͳ͍ w μʔΫϞʔυʹউखʹରԠͯ͘͠ΕΔͷ͕ศར w ७ਖ਼ϝϞΞϓϦͷઃܭ΋Ԟ͕ਂ͍

Slide 55

Slide 55 text

ࢀߟɿ ɾ*OUSPEVDJOH1FODJM,JU 88%$ IUUQTEFWFMPQFSBQQMFDPNWJEFPTQMBZXXED ɾ"QQMF1FODJMͰͷϝϞΛؾܰʹ͢ΔΞϓϦʮ-JLFB1BQFSʯΛݸਓ։ൃͨ͠ͷͰେมͩͬͨ͜ͱΛڞ༗ ͠·͢ʢ࣯ͷ2JJUBهࣄʣIUUQTRJJUBDPNTUJUFNTGDCBD Ͳ͏ͯ͠΋1FODJM,JU࢖͍ͨ͘ͳ͍Կ͔͕͋Δਓʢ಺༰ະ֬ೝʣɿ ɾ-FWFSBHJOH5PVDI*OQVUGPS%SBXJOH"QQTɹIUUQTEFWFMPQFSBQQMFDPNEPDVNFOUBUJPOVJLJU UPVDIFT@QSFTTFT@BOE@HFTUVSFTMFWFSBHJOH@UPVDI@JOQVU@GPS@ESBXJOH@BQQT