swift UIPrintPageRenderer printableRect.size.width всегда равен нулю (0)

Я использую 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)
    }
}

person Son of a Beach    schedule 14.03.2020    source источник


Ответы (1)


Я понял это. Кажется, что свойства 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)
    }
person Son of a Beach    schedule 15.03.2020