swift UIPrintPageRenderer printableRect.size.width всегда равен нулю (0) - PullRequest
0 голосов
/ 14 марта 2020

Я использую UIActivityViewController для печати (среди других действий). Поэтому я передаю ему экземпляр моего пользовательского подкласса UIPrintPageRenderer, соответствующий код которого приведен ниже.

По сути, я хочу напечатать две многострочные приписанные строки, бок о бок, как два столбца. (в конце концов, я бы хотел, чтобы одно было встроено в другое и обернуто вокруг, но здесь не будем забегать вперед). Текстовое представление справа должно иметь фиксированный размер в соответствии с его содержимым (его подкласс переопределяет sizeToFit () для достижения этой цели). Текстовое представление слева должно заполнить оставшуюся ширину.

Итак, я использую экземпляры UITextView, заполненные приписанными строками, и назначаю их соответствующие .viewPrintFormatter () `выходные данные в качестве UIPrintFormatters для UIPrintPageRenderer.

Это частично работает. Обе приписанные строки печатаются на странице.

Однако они печатаются друг на друге, оба на левом краю страницы.

Мои попытки использовать UIEdgeInsets для ограничения их печати не удается, если я не жестко кодировать значения. Похоже, это потому, что я получаю 0 (ноль) при запросе printableRect.size.width.

Почему printableRect моего UIPrintPageRendere всегда имеет нулевую ширину?

Как правильно выбрать сторону печать двух многострочных атрибутных строк?

class CustomPrintPageRenderer: UIPrintPageRenderer {
    let leftTextView = UITextView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
    let rightTextView = IngredientsTextView(frame: CGRect(x: 0.0, y: 0.0, width: 100.0, height: 100.0))

    init(_ thing: Thing) {
        super.init()
        addThing(thing)
    }

    func addThing(_ thing: Thing) {
        //  Do some stuff here to populate the two text views with attributed strings
        //  ...
        //  ...
        rightTextView.sizeToFit()
        let leftPrintFormatter = leftTextView.viewPrintFormatter()
        let rightPrintFormatter = rightTextView.viewPrintFormatter()
        print(paperRect.size.width)
        print(printableRect.size.width)
        rightPrintFormatter.perPageContentInsets = UIEdgeInsets(top: formatter.titleFontSize, left: printableRect.size.width - rightTextView.frame.size.width, bottom: 0, right: 0)
        leftPrintFormatter.perPageContentInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: rightTextView.frame.size.width)

        addPrintFormatter(leftPrintFormatter, startingAtPageAt: numberOfPages)
        addPrintFormatter(rightPrintFormatter, startingAtPageAt: numberOfPages)
    }
}

1 Ответ

0 голосов
/ 15 марта 2020

Я понял это. Кажется, что свойства paperRect и printableRect недоступны во время init () (из которого я вызывал свой addThing ()).

Я должен сделать эту работу, переопределив одну из других функций, такой как drawPrintFormatter () или numberOfPages (). Это работает в основном как ожидалось:

    override func drawPrintFormatter(_ printFormatter: UIPrintFormatter, forPageAt pageIndex: Int) {
        if printFormatter == rightPrintFormatter {
            printFormatter.perPageContentInsets = UIEdgeInsets(top: RecipeFormatter.titlePrintTextSize, left: printableRect.size.width - ingrWidth, bottom: 0, right: 0)
        } else if printFormatter == leftPrintFormatter {
            printFormatter.perPageContentInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: ingrWidth)
        }
        super.drawPrintFormatter(printFormatter, forPageAt: pageIndex)
    }
...