Мой пользовательский подкласс UIPrintPageRenderer использует множество UITextViewPringFormatters (по одному для каждой записи). В некоторых случаях я хотел бы напечатать несколько записей на одной странице, но для этого мне нужно выяснить, сколько страниц занято каждой записью, чтобы определить, как далеко вниз страницу печатать. следующая запись.
Я подумал, что должен иметь возможность использовать UITextViewPrintFormatter.rectForPage (). size.height (для последней страницы форматера), чтобы понять это:
someUITextViewPrintFormatter.rectForPage(at: someUITextViewPrintFormatter.pageCount - 1)
Однако он всегда просто возвращает весь печатный прямоугольник. Почему это так?
Как получить позицию на странице, с которой должна начинаться печать следующей записи?
Ниже приведена соответствующая часть моего пользовательского подкласса UIPrintPageRederer. Обратите внимание, что на самом деле для каждого рецепта есть два средства форматирования печати, и соответствующий раздел находится в самом конце:
override var numberOfPages: Int {
get {
formatPrinting()
return super.numberOfPages
}
}
func formatPrinting() {
var startPage: Int = 0
var startPagePrevRecBottom: CGFloat = 0.0
printFormatters = nil
for (i, detTextView) in detViews.enumerated() {
if i >= ingrViews.count {
print("FAILED to get ingredients text view when numbering pages")
return
}
let ingrTextView = ingrViews[i]
detTextView.frame = self.printableRect
detTextView.addSubview(ingrTextView)
ingrTextView.sizeToFit()
ingrTextView.frame.origin = CGPoint(x: detTextView.frame.size.width - ingrTextView.frame.size.width, y: RecipeFormatter.ingrPrintTopOffset)
let ingrPath = UIBezierPath(rect: CGRect(x: ingrTextView.frame.origin.x - 20,
y: ingrTextView.frame.origin.y - 10,
width: ingrTextView.frame.size.width + 40,
height: ingrTextView.frame.size.height + 20))
detTextView.textContainer.exclusionPaths = [ingrPath]
detTextView.sizeToFit()
let detPrintFormatter = detTextView.viewPrintFormatter()
let ingrPrintFormatter = ingrTextView.viewPrintFormatter()
ingrPrintFormatter.perPageContentInsets.left = printableRect.size.width - ingrTextView.frame.size.width
ingrPrintFormatter.perPageContentInsets.top = RecipeFormatter.ingrPrintTopOffset
addPrintFormatter(detPrintFormatter, startingAtPageAt: startPage)
addPrintFormatter(ingrPrintFormatter, startingAtPageAt: startPage)
let recHeight = max(detTextView.frame.size.height, ingrTextView.frame.size.height + ingrTextView.frame.origin.y)
let remainingHeight = printableRect.size.height - startPagePrevRecBottom
let recPageCount = max(detPrintFormatter.pageCount, ingrPrintFormatter.pageCount)
if startPagePrevRecBottom > 0 {
if recPageCount == 1 && remainingHeight > recHeight + RecipeFormatter.titlePrintTextSize {
detPrintFormatter.perPageContentInsets.top = startPagePrevRecBottom + RecipeFormatter.titlePrintTextSize
} else {
detPrintFormatter.removeFromPrintPageRenderer()
ingrPrintFormatter.removeFromPrintPageRenderer()
startPage += 1
addPrintFormatter(detPrintFormatter, startingAtPageAt: startPage)
addPrintFormatter(ingrPrintFormatter, startingAtPageAt: startPage)
}
}
ingrPrintFormatter.perPageContentInsets.top += detPrintFormatter.perPageContentInsets.top
startPage += recPageCount - 1
var rect = CGRect.zero
if ingrPrintFormatter.pageCount > detPrintFormatter.pageCount {
rect = ingrPrintFormatter.rectForPage(at: ingrPrintFormatter.pageCount - 1)
} else {
rect = detPrintFormatter.rectForPage(at: detPrintFormatter.pageCount - 1)
}
startPagePrevRecBottom = rect.origin.y + rect.size.height
print(printableRect.size.height)
print(paperRect.size.height)
print(rect.size.height)
}
}