UITextViewPrintFormatter.rectForPage (). Size.height всегда равен UIPrintPageRenderer.printableRect.size.height - PullRequest
0 голосов
/ 28 марта 2020

Мой пользовательский подкласс 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)
        }
    }
...