Slide 1

Slide 1 text

Copyright © ZOZO, Inc. ͸͡ΊͯͷPDFKit גࣜձࣾZOZO ϒϥϯυιϦϡʔγϣϯ։ൃຊ෦ FAANS෦ ϑϩϯτΤϯυϒϩοΫ Ճ౻ ঵ਅ @shoma10170806

Slide 2

Slide 2 text

© ZOZO, Inc. 2 גࣜձࣾZOZO ϒϥϯυιϦϡʔγϣϯ։ൃຊ෦ FAANS෦ ϑϩϯτΤϯυϒϩοΫ Ճ౻ ঵ਅ ● X: @shoma10170806 ● 2023೥4݄: ZOZOೖࣾʢ2೥໨ʣ ● γϣοϓελοϑͷൢചαϙʔτπʔϧ
 ʮFAANSʯͷiOSΞϓϦΛ։ൃ ● ത࢜ޙظ՝ఔʹࡏֶதɹը૾ॲཧͳͲͷݚڀʹैࣄ

Slide 3

Slide 3 text

© ZOZO, Inc. 3 FAANSͷ৽ػೳ ɾPDFͷදࣔػೳ - ίʔσΟωʔτͷ౤ߘʹ໾ཱͭ৘ใ - ֦େɾॖখ - ϖʔδ൪߸ͷදࣔ

Slide 4

Slide 4 text

© ZOZO, Inc. 4 FAANSͷ৽ػೳ ɾPDFͷදࣔػೳ - ίʔσΟωʔτͷ౤ߘʹ໾ཱͭ৘ใ - ֦େɾॖখ - ϖʔδ൪߸ͷදࣔ

Slide 5

Slide 5 text

© ZOZO, Inc. 5 FAANSͷ৽ػೳ ɾPDFͷදࣔػೳ - ίʔσΟωʔτͷ౤ߘʹ໾ཱͭ৘ใ - ֦େɾॖখ - ϖʔδ൪߸ͷදࣔ

Slide 6

Slide 6 text

© ZOZO, Inc. 6 FAANSͷ৽ػೳ PDFදࣔ: PDFKit ɾPDFͷදࣔػೳ - ίʔσΟωʔτͷ౤ߘʹ໾ཱͭ৘ใ - ֦େɾॖখ - ϖʔδ൪߸ͷදࣔ

Slide 7

Slide 7 text

© ZOZO, Inc. 7 Section1: PDFKitΛ༻͍ͨදࣔ Section2: ϖʔδ൪߸ͷߋ৽

Slide 8

Slide 8 text

© ZOZO, Inc. 8 Section1: PDFKitΛ༻͍ͨදࣔ Section2: ϖʔδ൪߸ͷߋ৽

Slide 9

Slide 9 text

© ZOZO, Inc. 9 PDFDocumentͷಡΈࠐΈ Section1: PDFKitΛ༻͍ͨදࣔ extension URLSession { func data(with url: URL) async throws -> (Data, URLResponse) { try await data(from: url) } } private func loadPdfDocument() async { var pdfDocument: PDFDocument? do { let (data, _) = try await URLSession.shared.data(with: pdfUrl) if let document = PDFDocument(data: data), document.pageCount > 0 { self.pdfDocument = document } } catch { // ಡΈࠐΈΤϥʔͷ৔߹ } }

Slide 10

Slide 10 text

© ZOZO, Inc. private func loadPdfDocument() async { var pdfDocument: PDFDocument? do { let (data, _) = try await URLSession.shared.data(with: pdfUrl) if let document = PDFDocument(data: data), document.pageCount > 0 { self.pdfDocument = document } } catch { // ಡΈࠐΈΤϥʔͷ৔߹ } } 10 PDFDocumentͷಡΈࠐΈ Section1: PDFKitΛ༻͍ͨදࣔ pdfUrl: https:// xxx.pdf extension URLSession { func data(with url: URL) async throws -> (Data, URLResponse) { try await data(from: url) } }

Slide 11

Slide 11 text

© ZOZO, Inc. private func loadPdfDocument() async { var pdfDocument: PDFDocument? do { let (data, _) = try await URLSession.shared.data(with: pdfUrl) if let document = PDFDocument(data: data), document.pageCount > 0 { self.pdfDocument = document } } catch { // ಡΈࠐΈΤϥʔͷ৔߹ } } extension URLSession { func data(with url: URL) async throws -> (Data, URLResponse) { try await data(from: url) } } 11 PDFDocumentͷಡΈࠐΈ Section1: PDFKitΛ༻͍ͨදࣔ ɾdata͔ΒPDFDocumentΛੜ੒ ɾϖʔδ਺: 1Ҏ্

Slide 12

Slide 12 text

© ZOZO, Inc. 12 PDFͷදࣔ let pdfView = PDFView() pdfView.document = document pdfView.displayMode = .singlePageContinuous pdfView.displayDirection = .vertical pdfView.autoScales = true pdfView.minScaleFactor = pdfView.scaleFactor ① PDFViewʹPDFDocumentͷૠೖ Section1: PDFKitΛ༻͍ͨදࣔ

Slide 13

Slide 13 text

© ZOZO, Inc. 13 PDFͷදࣔ ① PDFViewʹPDFDocumentͷૠೖ ② දࣔํ๏ͷઃఆ let pdfView = PDFView() pdfView.document = document pdfView.displayMode = .singlePageContinuous pdfView.displayDirection = .vertical pdfView.autoScales = true pdfView.minScaleFactor = pdfView.scaleFactor Section1: PDFKitΛ༻͍ͨදࣔ

Slide 14

Slide 14 text

© ZOZO, Inc. let pdfView = PDFView() pdfView.document = document pdfView.displayMode = .singlePageContinuous pdfView.displayDirection = .vertical pdfView.autoScales = true pdfView.minScaleFactor = pdfView.scaleFactor 14 PDFͷදࣔ ① PDFViewʹPDFDocumentͷૠೖ ② දࣔํ๏ͷઃఆ ③ PDFͷαΠζΛࣗಈͰௐ੔ Section1: PDFKitΛ༻͍ͨදࣔ

Slide 15

Slide 15 text

© ZOZO, Inc. let pdfView = PDFView() pdfView.document = document pdfView.displayMode = .singlePageContinuous pdfView.displayDirection = .vertical pdfView.autoScales = true pdfView.minScaleFactor = pdfView.scaleFactor 15 PDFͷදࣔ ① PDFViewʹPDFDocumentͷૠೖ ② දࣔํ๏ͷઃఆ ④ ॖখαΠζͷ࠷খ஋ͷܾఆ ③ PDFͷαΠζΛࣗಈͰௐ੔ Section1: PDFKitΛ༻͍ͨදࣔ

Slide 16

Slide 16 text

© ZOZO, Inc. let pdfView = PDFView() pdfView.document = document pdfView.displayMode = .singlePageContinuous pdfView.displayDirection = .vertical pdfView.autoScales = true pdfView.minScaleFactor = pdfView.scaleFactor 16 PDFͷදࣔ ① PDFViewʹPDFDocumentͷૠೖ ② දࣔํ๏ͷઃఆ ④ ॖখαΠζͷ࠷খ஋ͷܾఆ ③ PDFͷαΠζΛࣗಈͰௐ੔ Section1: PDFKitΛ༻͍ͨදࣔ

Slide 17

Slide 17 text

© ZOZO, Inc. 17 ॳظঢ়ଶʹ͓͚ΔPDFදࣔҐஔͷζϨ ॳظදࣔʢζϨʣ ਖ਼ৗ ζϨ Section1: PDFKitΛ༻͍ͨදࣔ

Slide 18

Slide 18 text

© ZOZO, Inc. 18 ζϨ ɾζϨͷݪҼ - PDFͷαΠζ - தԝἧ͑ Section1: PDFKitΛ༻͍ͨදࣔ ॳظঢ়ଶʹ͓͚ΔPDFදࣔҐஔͷζϨ ਖ਼ৗ ॳظදࣔʢζϨʣ

Slide 19

Slide 19 text

© ZOZO, Inc. 19 ζϨ ɾζϨͷݪҼ - PDFͷαΠζ - தԝἧ͑ Section1: PDFKitΛ༻͍ͨදࣔ ॳظঢ়ଶʹ͓͚ΔPDFදࣔҐஔͷζϨ ॳظঢ়ଶ: PDFࠨ্͕ը໘಺ ਖ਼ৗ ॳظදࣔʢζϨʣ

Slide 20

Slide 20 text

© ZOZO, Inc. 20 ζϨͷվળํ๏ if let firstPage = document.page(at: 0) { pdfView.go( to: firstPage.bounds(for: pdfView.displayBox), on: firstPage ) } Section1: PDFKitΛ༻͍ͨදࣔ

Slide 21

Slide 21 text

© ZOZO, Inc. 21 if let firstPage = document.page(at: 0) { pdfView.go( to: firstPage.bounds(for: pdfView.displayBox), on: firstPage ) } ① PDFDocumentͷ1ϖʔδΛऔಘ ② 1ϖʔδ໨ͷࠨ্͕දࣔ͞ΕΔΑ͏ʹҠಈ Section1: PDFKitΛ༻͍ͨදࣔ ζϨͷվળํ๏

Slide 22

Slide 22 text

© ZOZO, Inc. 22 Section1: PDFKitΛ༻͍ͨදࣔ Section2: ϖʔδ൪߸ͷߋ৽

Slide 23

Slide 23 text

© ZOZO, Inc. 23 ϖʔδ൪߸ͷදࣔ ࠨଆ: ݱࡏͷϖʔδ൪߸ ӈଆ: ૯ϖʔδ਺

Slide 24

Slide 24 text

© ZOZO, Inc. 24 ϖʔδ൪߸ͷऔಘํ๏ let document: PDFDocument? let pdfView = PDFView() let totalPage = document.pageCount NotificationCenter.default .addObserver(forName: .PDFViewPageChanged, object: pdfView, queue: .main) { _ in Task { @MainActor in let pageNumber = pdfView.currentPage?.pageRef?.pageNumber } } ࠨଆ: ݱࡏͷϖʔδ൪߸ ӈଆ: ૯ϖʔδ਺ ① ૯ϖʔδ਺ͷऔಘ

Slide 25

Slide 25 text

© ZOZO, Inc. 25 ϖʔδ൪߸ͷऔಘํ๏ let document: PDFDocument? let pdfView = PDFView() let totalPage = document.pageCount NotificationCenter.default .addObserver(forName: .PDFViewPageChanged, object: pdfView, queue: .main) { _ in Task { @MainActor in let pageNumber = pdfView.currentPage?.pageRef?.pageNumber } } ࠨଆ: ݱࡏͷϖʔδ൪߸ ӈଆ: ૯ϖʔδ਺ ① ૯ϖʔδ਺ͷऔಘ ② ϖʔδͷมߋ؂ࢹɾ൪߸औಘ

Slide 26

Slide 26 text

© ZOZO, Inc. 26 ϖʔδ൪߸ͷऔಘํ๏ let document: PDFDocument? let pdfView = PDFView() let totalPage = document.pageCount NotificationCenter.default .addObserver(forName: .PDFViewPageChanged, object: pdfView, queue: .main) { _ in Task { @MainActor in let pageNumber = pdfView.currentPage?.pageRef?.pageNumber } } ࠨଆ: ݱࡏͷϖʔδ൪߸ ӈଆ: ૯ϖʔδ਺ ① ૯ϖʔδ਺ͷऔಘ ② ϖʔδͷมߋ؂ࢹɾ൪߸औಘ

Slide 27

Slide 27 text

© ZOZO, Inc. 27 ϖʔδ൪߸औಘͷ໰୊఺ ɾԣ௕ͷPDF - ը໘্ʹෳ਺ຕͷPDF - ϖʔδ൪߸: 2͔Βදࣔ͞ΕΔ ॳظঢ়ଶ: ϖʔδ൪߸Λ1ʹ͢Δ ※ Πϝʔδը૾

Slide 28

Slide 28 text

© ZOZO, Inc. 28 ॳظঢ়ଶͷ൑ఆํ๏ ɾoffset͕0: ϖʔδ൪߸1 PDFView: offset͸औಘͰ͖ͳ͍

Slide 29

Slide 29 text

© ZOZO, Inc. 29 ॳظঢ়ଶͷ൑ఆํ๏ UIScrollView extension PDFView { func scrollView() -> UIScrollView? { return self.subviews.compactMap { $0 as? UIScrollView }.first } } ɾoffset͕0: ϖʔδ൪߸1 PDFView: offset͸औಘͰ͖ͳ͍ ϫʔΫΞϥ΢ϯυ

Slide 30

Slide 30 text

© ZOZO, Inc. 30 ॳظঢ়ଶͷ൑ఆํ๏ if let scrollView = pdfView.scrollView() { scrollView.publisher(for: \.contentOffset) .sink { [weak pdfView] contentOffset in Task { @MainActor in guard let pdfView = pdfView else { return } if contentOffset.y <= 0.0 { currentPage = 1 } else if let pageNumber = pdfView.currentPage?.pageRef?.pageNumber, pageNumber != currentPage { NotificationCenter.default.post( name: .PDFViewPageChanged, object: pdfView ) } } } } ① UIScrollViewͷݕग़ ② offSetͷpublisherΛൃߦ

Slide 31

Slide 31 text

© ZOZO, Inc. if let scrollView = pdfView.scrollView() { scrollView.publisher(for: \.contentOffset) .sink { [weak pdfView] contentOffset in Task { @MainActor in guard let pdfView = pdfView else { return } if contentOffset.y <= 0.0 { currentPage = 1 } else if let pageNumber = pdfView.currentPage?.pageRef?.pageNumber, pageNumber != currentPage { NotificationCenter.default.post( name: .PDFViewPageChanged, object: pdfView ) } } } } 31 ॳظঢ়ଶͷ൑ఆํ๏ ③ ϖʔδ൪߸ͷߋ৽ ① UIScrollViewͷݕग़ ② offSetͷpublisherΛൃߦ

Slide 32

Slide 32 text

© ZOZO, Inc. if let scrollView = pdfView.scrollView() { scrollView.publisher(for: \.contentOffset) .sink { [weak pdfView] contentOffset in Task { @MainActor in guard let pdfView = pdfView else { return } if contentOffset.y <= 0.0 { currentPage = 1 } else if let pageNumber = pdfView.currentPage?.pageRef?.pageNumber, pageNumber != currentPage { NotificationCenter.default.post( name: .PDFViewPageChanged, object: pdfView ) } } } } 32 ॳظঢ়ଶͷ൑ఆํ๏ ③ ϖʔδ൪߸ͷߋ৽ ① UIScrollViewͷݕग़ ② offSetͷpublisherΛൃߦ

Slide 33

Slide 33 text

© ZOZO, Inc. if let scrollView = pdfView.scrollView() { scrollView.publisher(for: \.contentOffset) .sink { [weak pdfView] contentOffset in Task { @MainActor in guard let pdfView = pdfView else { return } if contentOffset.y <= 0.0 { currentPage = 1 } else if let pageNumber = pdfView.currentPage?.pageRef?.pageNumber, pageNumber != currentPage { NotificationCenter.default.post( name: .PDFViewPageChanged, object: pdfView ) } } } } 33 ॳظঢ়ଶͷ൑ఆํ๏ ③ ϖʔδ൪߸ͷߋ৽ ① UIScrollViewͷݕग़ ② offSetͷpublisherΛൃߦ

Slide 34

Slide 34 text

© ZOZO, Inc. 34 ϖʔδ൪߸ͷදࣔ݁Ռ ※දࣔ͞Ε͍ͯΔPDF͸ΠϝʔδͰ͢

Slide 35

Slide 35 text

© ZOZO, Inc. 35 ·ͱΊ ɾPDFKitͷ࢖͍ํ ɹ- PDFKitΛ༻͍ͨPDFදࣔ ɹ- ϖʔδ൪߸ͷߋ৽

Slide 36

Slide 36 text

No content