Несколько 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)
}