Несколько NSTextContainers не работают должным образом с UIPageViewController

У меня есть длинный текст (несколько страниц экрана), хранящийся в NSTextStorage. Я создаю экземпляр NSLayoutManager() и добавляю к нему textStorage. Затем я продолжаю добавлять NSTextContainers определенного размера, пока не израсходую весь текст. Контейнеры также добавляются в массив. Идея в том, что это рассчитывается только один раз, поэтому позже я могу работать только с контейнерами (страницами).

Это все часть класса модели, который создается в UIPageViewController. UIPageViewController представляет ViewControllers, которые содержат только UITextView и имеют ссылку на модель. UITextView создается с использованием NSTextContainer из массива, описанного выше.

Это все работает хорошо, проблема в том, что это работает только один раз. Как только я "переворачиваю" страницу, другая страница становится пустой. Когда я нахожусь в пейзаже, я получаю два ViewController, и они оба загружаются правильно. Опять же, как только я переворачиваю страницу, textView становится пустым.

Это прекрасно работает, когда я создаю новые NSTextStorage, NSLayoutManager и NSTextContainers каждый раз, когда страница переворачивается, однако это ужасно медленно и неэффективно.

Есть идеи, что может быть причиной?

РЕДАКТИРОВАТЬ:

Это создает textView на странице, созданной UIPageViewController:

    func reloadData() {
    let rect = CGRect(
        x: view.bounds.origin.x + spacing,
        y: view.bounds.origin.y + spacing,
        width: view.bounds.width - spacing * 2,
        height: view.bounds.height - spacing * 2)
    if let textContainer = bookReader.getPage(pageIndex, frame: rect) {
        textView = UITextView(frame: rect, textContainer: textContainer)
        textView!.textAlignment = textAlignment
        textView!.editable = false
        lastSize = textView!.frame
        view.addSubview(textView!)
    } else {
        print("did't get a page")
    }
}

И это в модели, созданной UIPageViewController, вызываемой приведенным выше кодом:

    func getPage(page: Int, frame: CGRect) -> NSTextContainer? {
    // if the screen size was changed (rotated) erase everything
    if self.lastFrame != frame {
        print("size was changed")
        chapters.removeAll()
        self.lastFrame = frame
    }

    // if the data has been already calculated
    if chapters.count > 0 {
        // find chapter and page (this part is not working correctly yet but that doesn`t really matter in this case, it just fetches wrong page in some cases)
        var chapter = 0
        var subPage = 0
        var checkedPages = 0
        for i in 0..<chapters.count {
            if page - 1 < (i + 1) * chapters[i]!.count {
                chapter = i
                subPage = page - 1 - checkedPages
                break
            } else {
                checkedPages += chapters[i]!.count
            }
        }

        print("desired page: \(page) - chapter: \(chapter), page: \(subPage)")

        // return textContainer
        if let textContainer = chapters[chapter]?[subPage] {
            print("the container is in the array")
            return textContainer
        } else {
            print("page couldn't been found")
            return nil
        }
    } else {
        // calculate the whole book

        numberOfPages = 0

        for (index, url) in htmls.enumerate() {
            let data = NSData(contentsOfURL: url)
            let attributedString = NSAttributedString(HTMLData: data, options: options, documentAttributes: nil)

            let textStorage = NSTextStorage(attributedString: attributedString)
            let layoutManager = NSLayoutManager()
            textStorage.addLayoutManager(layoutManager)

            var i = 0
            while layoutManager.textContainerForGlyphAtIndex(textStorage.length - 1, effectiveRange: nil) == nil {
                let textContainer = NSTextContainer(size: frame.size)
                layoutManager.addTextContainer(textContainer)
                if chapters[index] != nil {
                    chapters[index]![i] = textContainer
                } else {
                    chapters[index] = [i:textContainer]
                }

                i++
            }
            numberOfPages += i - 1
            print("chapter \(index) count \(chapters[index]!.count)")
        }
    }

    print("recursive call, number of pages: \(numberOfPages)")

    return getPage(page, frame: frame)
}

0 ответов

Другие вопросы по тегам