返回專案列表

Koma — iPad 離線漫畫閱讀器

Swift/SwiftUI 原生 iPad 應用 —— 支援 6 類漫畫格式、日漫右翻、跨卷連讀,完全離線零收集。

Koma — iPad 離線漫畫閱讀器
客戶 Personal product·角色 獨立開發 —— 設計、工程、App Store 素材·開始 2026年7月10日
行動開發UI/UX 設計SwiftSwiftUI個人專案

概述

Koma 是一款我從解壓引擎到 App Store 素材全部獨立完成的 iPad 專用漫畫閱讀器。透過檔案魔數識別開啟 CBZ、CBR、CB7、CBT、PDF 和圖片型 EPUB,支援日漫右翻與真正的雙頁跨頁排版,卷與卷之間無縫連讀,且完全不連網 —— 零追蹤、零資料收集。

為什麼再做一個漫畫閱讀器

我想要一個像 Apple Books 對待書那樣對待漫畫的閱讀器:開啟你手上已有的檔案,記住讀到哪裡,然後把自己藏起來。商店裡的多數閱讀器要麼強制雲端帳號,要麼書架上貼滿廣告,要麼根本處理不好日漫的右翻。Koma 從設計上就是完全離線的 —— 隱私清單裡聲明零追蹤、資料收集列表為空,因為確實沒有任何東西可以聲明。檔案透過 security-scoped bookmark 就地開啟,你的書庫不會被複製或上傳到任何地方。

只有兩個依賴的解壓引擎

Koma 能開啟六種格式 —— CBZ/ZIP、CBR(RAR)、CB7(7z)、CBT(TAR)、PDF 和圖片型 EPUB —— 外加普通圖片資料夾。其中 ZIP 和 TAR 解壓器完全自研;PDF 透過 PDFKit 按需向量渲染,EPUB 按 OPF spine 解析,頁序以此為準。只有 RAR 和 7z 引入了函式庫(Unrar.swift 和 SWCompression),因為這兩種演算法沒有自寫的道理。所有檔案都靠魔數而非副檔名識別 —— 副檔名寫錯的壓縮包照樣能開。並且永遠不整包解壓:頁面按需逐張解出來。

像讀一本真正的書

翻頁模式基於 UIPageViewController,保留系統級、可中斷的翻頁手感,同時支援日漫右翻和歐美左翻。匯入時 Koma 用部分解壓探測每頁尺寸 —— 亞秒級完成,不用解開整個壓縮包 —— 因此跨頁大圖提前可知,雙頁模式下獨占一屏,還有「裝訂」開關處理封面單獨成頁時的配對錯位。讀完一卷,下一卷自動接上;在第一頁往回翻,落在上一卷的最後一頁。條漫模式則是獨立的 UICollectionView 路徑:高度從尺寸快取預知,圖片載入永遠不會引起版面跳動。

效能本身就是功能

漫畫掃圖很大 —— 一張 2000×3000 的頁面如果樸素解碼,還沒上屏就要吃掉約 24 MB 記憶體。Koma 透過 ImageIO 直接降採樣到目標尺寸,同一頁只占幾 MB,真正放大時才解碼高解析度版本。頁面快取是帶真實位元組預算的 NSCache(實體記憶體的五分之一),收到記憶體警告立即清空。小細節也保持同樣的用心:放大狀態下翻頁有橡皮筋阻力,條漫模式縱向滑動可以壓暗亮度。

「墨與紙」設計系統

介面刻意做成單色:淺色模式是暖紙白,暗色模式是炭墨色,用髮絲細線做層次,導航標題用襯線體 —— 書的 App 該有一點書卷氣。彩色只留給語義 —— 僅用於警告和破壞性操作。閱讀器工具列是懸浮的圓角膠囊,而不是通欄鋪滿:漫畫永遠是主角,介面只是短暫來訪的客人。閱讀頁面本身在兩種模式下都保持純黑。應用內建四種語言的使用手冊(English、日本語、简体中文、繁體中文)—— 以漫畫格式的 CBZ 呈現,首次啟動時自動出現在書架上。

技術棧

約 5,800 行 Swift 5.10 程式碼,iPad 專用,iOS 17+。書架和庫用 SwiftUI;手感關鍵的地方交給 UIKit —— 翻頁閱讀用 UIPageViewController,條漫捲動用 UICollectionView —— 工具列再以 SwiftUI 浮層蓋回來。狀態管理用 iOS 17 的 @Observable,工程由納入版本控制的 project.yml 經 xcodegen 生成,單元測試涵蓋解壓後端、檔名解析、雙頁版面和翻頁方向。App Store 材料齊備:隱私清單、字串目錄(英文和日文介面)、以及整套 2064×2752 行銷截圖。

相關專案