Разметка содержания страницы

Когда представление распечатано, существует несколько опций для того, как оно помещается на странице. Если представление больше, чем единственная страница, представление может быть отсечено, изменено или размещено рядом через многократные страницы. Расположение представления на каждой странице может быть скорректировано. Наконец, представление может добавить украшения к каждой странице. Следующие разделы описывают опции, доступные для размещения представления на страницу.

Выбор границ страницы для содержания, превышающих единственную страницу

Когда представление является слишком большим для адаптации на единственную страницу, представление может быть распечатано одним из нескольких способов. Представление может разместить себя рядом на отдельные логические страницы так, чтобы была распечатана его вся видимая область. Также представление может отсечь себя и распечатать только область, соответствующую на первой странице. Наконец, представление может изменить размеры себя для адаптации на единственную страницу. Эти опции могут быть установлены с помощью NSPrintInfo объект setHorizontalPagination: и setVerticalPagination: методы с константами NSClipPagination, NSFitPagination, и NSAutoPagination. Отдельные методы для горизонтального и вертикального разбиения на страницы позволяют Вам смешивать эти способы поведения. Например, можно отсечь изображение в одной размерности, но разместить его рядом в другом. Если эти опции не достаточны, представление может также реализовать свою собственную схему разбиения на страницы. Следующие разделы описывают каждую опцию.

Пользовательское разбиение на страницы

Обеспечить абсолютно пользовательскую схему разбиения на страницы, не использующую встроенную поддержку разбиения на страницы NSView класс, представление должно реализовать только два простых метода и установить

  1. Установите режим разбиения на страницы (NSPrintingPaginationMode) использование надлежащий метод NSPrintInfo (setHorizontalPagination: или setVerticalPagination:

  2. Переопределите knowsPageRange: метод, таким образом, это возвращается YES указать пользовательское представление расположит размерность каждой страницы.

  3. Реализуйте rectForPage: метод, таким образом, это использует номер страницы страницы и текущую информацию о печати для вычисления надлежащего прямоугольника в системе координат представления. Система печати отправляет a rectForPage: обменивайтесь сообщениями к своему приложению, прежде чем каждая страница будет распечатана, основа на диапазоне страниц, которые пользователь выбирает в панели Print. Обратите внимание на то, что вертикальные и горизонтальные настройки разбиения на страницы в NSPrintInfo объект проигнорирован (если Ваша реализация не принимает их во внимание).

Перечисление 4-1 показывает простую реализацию, разделяющую представление вертикально на страницы, имеющие максимальный размер. Код не показывает установку режима разбиения на страницы, который необходимо сделать.

  Код перечисления 4-1, разделяющий представление вертикально на страницы

// Return the number of pages available for printing
- (BOOL)knowsPageRange:(NSRangePointer)range {
    NSRect bounds = [self bounds];
    float printHeight = [self calculatePrintHeight];
 
    range->location = 1;
    range->length = NSHeight(bounds) / printHeight + 1;
    return YES;
}
 
// Return the drawing rectangle for a particular page number
- (NSRect)rectForPage:(int)page {
    NSRect bounds = [self bounds];
    float pageHeight = [self calculatePrintHeight];
    return NSMakeRect( NSMinX(bounds), NSMaxY(bounds) - page * pageHeight,
                        NSWidth(bounds), pageHeight );
}
 
// Calculate the vertical size of the view that fits on a single page
- (float)calculatePrintHeight {
    // Obtain the print info object for the current operation
    NSPrintInfo *pi = [[NSPrintOperation currentOperation] printInfo];
 
    // Calculate the page height in points
    NSSize paperSize = [pi paperSize];
    float pageHeight = paperSize.height - [pi topMargin] - [pi bottomMargin];
 
    // Convert height to the scaled view
    float scale = [[[pi dictionary] objectForKey:NSPrintScalingFactor]
                    floatValue];
    return pageHeight / scale;
}

Добавление номеров страниц, Знаков обрезки и разовых датой строк к странице

При выполнении пользовательского разбиения на страницы можно переопределить drawPageBorderWithSize: метод для добавления дополнительных опций к странице, таких как обрезка отмечает, дата/строки времени или номера страниц. Когда Вы переопределяете drawPageBorderWithSize::

  1. Сохраните существующий каркас кузова представления — необходимо будет восстановить его в конце метода.

  2. Измените размеры каркаса кузова к rect с источником (0,0) и размер равняется поступлению borderSize параметр.

    Этот новый кадр теперь охватывает поля вместо того, чтобы скрыть их.

  3. Добавьте свои пользовательские элементы границы ко всем четырем граничным областям (вершина, нижняя часть, оставленная, и право).

    Вы обычно используете drawAtPoint: метод для рисования. Любым набором рисования вызовов нужно предшествовать lockFocus: и сопровождаемый unlockFocus:, иначе drawPageBorderWithSize: ничего не нарисует к странице для тех вызовов.

    Используйте бумагу и граничные размерности от информационного объекта печати ограничить печатаемую область и предотвратить drawPageBorderWithSize: от печати в кадре основного текста. Если Вы хотите распечатать в кадре основного текста — для печати водяного знака, например — делают так путем печати непосредственно в недавно увеличенном кадре и игнорирования граничных ограничений.

  4. Сбросьте кадр к области основного текста прежде, чем выйти из метода.

    Это гарантирует, что следующая страница содержания распечатает только в разбитой на страницы части представления.

Мозаичное размещение содержания через страницы

Если представление не предоставляет свою собственную информацию разбиения на страницы, и одна из информационных настроек разбиения на страницы объекта печати NSAutoPagination, NSView попытки соответствовать такому же большому представлению, распечатываемому на логическую страницу, нарезая представление в самые большие блоки вдоль данного направления (горизонталь или вертикальный). Это достаточно для многих представлений, но если изображение представления должно быть разделено только в определенных местах — между строками текста или ячеек в таблице, например — представление может скорректировать автоматический механизм для размещения этого путем сокращения высоты или ширины каждой страницы.

Прежде чем печать начинается, представление вычисляет позиции всей строки и разрывов страницы столбца и дает Вам возможность скорректировать их. adjustPageHeightNew:top:bottom:limit: метод обеспечивает параметр для новой нижней координаты страницы, сопровождаемой предложенным верхом и низом. Дополнительный параметр ограничивает высоту страницы; нижняя часть не может быть перемещена выше его. adjustPageWidthNew:left:right:limit: метод работает таким же образом, чтобы позволить представлению корректировать ширину страницы. Пределы вычисляются как процент высоты или ширины предложенной страницы. Ваш подкласс представления может также настроить этот процент путем переопределения методов heightAdjustLimit и widthAdjustLimit возвратить часть страницы, которая может быть скорректирована; значение нуля указывает, что никакие корректировки не позволяются, тогда как значение каждый указывает, что правый или базовый край границ страницы может быть скорректирован полностью левым или главному краю.

Отсечение содержания к странице

Если одно из информационных значений разбиения на страницы объекта печати NSClipPagination, представление отсекается к единственной странице вдоль той размерности. Если горизонтальное разбиение на страницы установлено в отсеченный, левые, большая часть раздела представления распечатана, отсечена к ширине единственной страницы. Если вертикальное разбиение на страницы установлено в отсеченный, самый верхний раздел представления распечатан, отсечен к высоте единственной страницы.

Подходящее содержание к странице

Если информационная установка разбиения на страницы объекта печати NSFitPagination, изображение изменено для адаптации на страницу. Несмотря на то, что вертикальное и горизонтальное разбиение на страницы не должно быть тем же, если любая размерность масштабируется, другая размерность масштабируется той же суммой, чтобы избежать искажать изображение. Если обе размерности масштабируются, масштабный коэффициент, производящий меньшее изображение, используется, таким образом избегая и искажения и отсечения. Обратите внимание на то, что распечатайте информационный масштабный коэффициент объекта (NSPrintScalingFactor), который пользовательские наборы в панели Page Layout, независимо от масштабирования, это наложено разбиением на страницы и применяется после масштабирования разбиения на страницы.

Расположение содержания на логической странице

NSView метод locationOfPrintRect: содержание мест согласно нескольким информационным атрибутам печати. По умолчанию это помещает изображение в верхний левый угол страницы, но если информационный объект печати isHorizontallyCentered или isVerticallyCentered возврат методов YES, это центрирует изображение единственной страницы вдоль надлежащей оси. Документ многократной страницы, однако, всегда помещается в главный левый угол страницы так, чтобы разделенные части могли быть собраны в их краях.

Переопределите этот метод для расположения изображения сами. Точка, возвращенная locationOfPrintRect: относительно нижнего левого угла бумаги в координатах страницы. Необходимо включать поля страницы при вычислении позиции.

После NSView расположите прямоугольник на странице, он вызывает drawPageBorderWithSize:. Если Вы не реализовали этот метод, ничто не происходит. Если Вы реализовали drawPageBorderWithSize:, любые дополнительные метки — обрезают метки, номера страниц, и т.д. — Вы рисуете в этом методе, добавляются к странице. drawPageBorderWithSize: метод вызывается системой печати один раз для каждой страницы.

Посмотрите Пользовательское Разбиение на страницы для получения дополнительной информации об использовании drawPageBorderWithSize:.