iOS向けのスライドショーUIライブラリを作った


↓こういうやつ

使い方

画像URLの配列の場合

let v = SlideViewerController.setup(
    mainImageURLs: [
        URL(string: "https://example.com/path/to/slide/1.png")!,
        URL(string: "https://example.com/path/to/slide/2.png")!,
        ...
    ],
    thumbImageURLs: [
        URL(string: "https://example.com/path/to/slide/thumb/1.png")!,
        URL(string: "https://example.com/path/to/slide/thumb/2.png")!,
        ...
    ]
)
present(v, animated: true)

PDFファイルのURLの場合

let pdfURL = "https://speakerd.s3.amazonaws.com/presentations/50021f75cf1db900020005e7/speakerdeck.pdf"
let v = SlideViewerController.setup(pdfFileURL: URL(string: pdfURL)!)
present(v, animated: true, completion: nil)

バンドルされたPDFファイルの場合

let path = Bundle.main.path(forResource: "speakerdeck", ofType: "pdf")
let url = URL(fileURLWithPath: path!)
let doc = PDFDocument(url: url)
let v = SlideViewerController.setup(pdfDocument: doc!)
present(v, animated: true)

ここがイケてる

  • SlideShareアプリのUI・挙動をほぼ完コピした
    • ビューアーとして本家並には使いやすいと思う
  • 複数のインプット形式に対応している
    • 画像URLの配列, PDFファイルのURL, ローカルのPDFファイル
    • スライドショー的な用途もあるし、単にPDFビューアーとしても使える
  • 縦・横どちらにも対応している

ここがイケてない

  • 画像のダウンロード順の賢い制御はしてない
    • キューに全画像のダウンロードタスクをいれて、裏でダウンロードしておくとよりUX良さそうだけどやっていない
  • たまに画像サイズの調整がバグる
  • carthage対応まだしてない

実装時の工夫ポイント

  • 画像のリサイズなどの[重い処理かつバックグラウンドスレッドで実行できる処理]はできるだけそちらでやるようにした
    • UIがカクつかずスムーズ
  • ReSwiftを使っており、ステートの管理がシンプルにできている
    • 素朴に実装していたらもうちょっと複雑なコードになってしまった気がする

おまけ

このライブラリは、実は下記の記事で作りかけで放置していたもの
https://qiita.com/abeyuya/items/6587a8f3990606f40429

社内でiOSエンジニアで集まって勉強会的なことやろう、ということになり、その発表でこのライブラリについて話すことになった
実装はほぼ完了していたし、せっかくなのでライブラリとしてリリースできる状態に最低限は整備した
せっかくなのでqiitaでも記事にしようと思った