-4

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?

ptfpn
  • 3
  • 3

1 Answers1

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