I'm trying to make an epub reader app in swift. I parse an epub file and get all metadata and xhtml's. Then, if the user wants to read the book, I append all of the book's text to uitextview. Are there any possible solutions to display text in book pages (not scroll view) as the native Books app does in ios?
Asked
Active
Viewed 542 times
1 Answers
0
Please include a minimal, reproducible example in your post. That said, following is an example of the book format that Apple uses for the page flip.
class ViewController: UIViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource {
let viewControllers: [UIViewController] = {
var viewControllers = [ContentViewController]()
for index in 1...10 {
let textView = UITextView()
textView.text = "Page \(index)"
let contentVC = ContentViewController(textView: textView)
viewControllers.append(contentVC)
}
return viewControllers
}()
override func viewDidLoad() {
super.viewDidLoad()
let pageVC = UIPageViewController(transitionStyle: .pageCurl, navigationOrientation: .horizontal, options: nil)
pageVC.dataSource = self
pageVC.delegate = self
pageVC.setViewControllers(viewControllers, direction: .forward, animated: true, completion: nil)
addChild(pageVC)
self.view.addSubview(pageVC.view)
pageVC.view.frame = self.view.bounds
pageVC.didMove(toParent: self)
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
guard var index = viewControllers.firstIndex(of: viewController), index > 0 else { return nil }
index -= 1
return viewControllers[index]
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
guard var index = viewControllers.firstIndex(of: viewController), index < viewControllers.count else { return nil }
index += 1
return viewControllers[index]
}
}
class ContentViewController: UIViewController {
var textView = UITextView()
init(textView: UITextView) {
self.textView = textView
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
self.view.addSubview(textView)
self.textView.bounds = self.view.frame
}
}
As for parsing ePub, you'll have to uncompress and parse XML.

Kevvv
- 3,655
- 10
- 44
- 90