Почему мое печатное изображение NSPrintOperation усекает мой вид текста (), но изображение на экране отображает те же самые точные текстовые представления

0

Вопрос

Во-первых, я приношу извинения за отсутствие изображений. Очевидно, я все еще слишком новичок здесь, чтобы сделать это. Я попытаюсь описать проблему устно и приведу два ключевых фрагмента кода.

Я печатаю телевизионное расписание с рядами временных интервалов. Когда я отображаю представление на экране macos, оно выглядит примерно так:

40.    8:00 AM                    8:30 AM
CNN.   Bla Bla Bla Talk Show 1.   Whatever Talk Show 1, with
       Guests to discuss price    Great Host 
       of bla bla bla.            Host will talk about
                                  Whatever

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

40.    8:00 AM                    8:30 AM
CNN.   Bla Bla Bla Talk Sh ...    Whatever Talk Show 1, w...
       Guests to discuss pr...    Host will talk about 
                                  Whatever

Если вы заметили несоответствие, то это потому, что оно не совсем последовательное. Иногда я получаю вывод в две строки, но чаще я получаю усечение с многоточием. Я так и не понял, в чем причина, лежащая в основе. Но только в рамке печати это проблема. На экране отображается именно то, что я хочу.

Поэтому я поискал решения и перепробовал множество вариантов модификаторов Text() FixedSize() и lineLimit(). FixedSize работает так, что элементы из двух строк не усекаются, но, опять же, в режиме печати строка с высокой ячейкой обрезает строки выше и ниже нее. Это действительно похоже на то, что NSRect, обрамляющий печатное изображение, просто недостаточно велик, но он огромен, и этого не должно происходить.

Проект слишком велик, чтобы предоставить весь код, но, надеюсь, его будет достаточно, чтобы предоставить рассматриваемое представление плюс логику принтера.

Представление (это отображается правильно - без усечения):

struct ScheduleDisplayView: View {
    
    var schedule: [SchedSlot]
    
    let chanmax: CGFloat = 28.0
    let fontsize: CGFloat = 7.0
    let cellmax: CGFloat = 120
    
    var sortedData : [DayBlock] {
        let schedTree: ScheduleTree = ScheduleTree.init()
        for ss in schedule {
            schedTree.add(schedSlot: ss)
        }
        return schedTree.dayList
    }
    
    var body: some View {
        
        List {
            ForEach(sortedData, id: \.dateStamp) { day in
                Text("\(day.dateStamp)")
                    .bold()
                ForEach(day.qList, id: \.QTag) { qblock in
                    ForEach(qblock.chanList.sorted(by: <), id: \.chanTag) { channel in
                        HStack(alignment: .top, spacing: 0) {
                            VStack(spacing: 0) {
                                Text(String(channel.chanTag))
                                Text(channel.callSign.prefix(4))
                            }
                            .border(Color.yellow)
                            .frame(maxWidth: chanmax, alignment: .topLeading)
                            .padding(0)
                            ForEach(channel.timeList, id: \.timeTag) { timecell in
                                VStack(spacing: 0) {
                                    Text("\(timecell.timeTag)")
                                        .frame(maxWidth: .infinity, alignment: .topLeading)
                                    ForEach(timecell.cellList, id: \.id) { cell in
                                        if cell.startTime != timecell.timeTag {
                                            Text("\(cell.title) (\(cell.startTime))")
                                                .foregroundColor(.blue)
                                                .frame(maxWidth: .infinity, alignment: .topLeading)
                                                .lineLimit(2)
                                        } else {
                                            Text(cell.title)
                                                .foregroundColor(.blue)
                                                .frame(maxWidth: .infinity, alignment: .topLeading)
                                                .lineLimit(2)
                                        }
                                        Text(cell.subtitle)
                                            .frame(maxWidth: .infinity, alignment: .topLeading)
                                            .lineLimit(2)
                                    }
                                }
                            }
                            .border(Color.green)
                            .frame(maxWidth: .infinity, alignment: .leading)
                        }
                        .font(.system(size: fontsize))
                        .border(Color.blue)
                    }
                }
            }
        }
    }
}

А вот и функция печати. Ему все еще не хватает функциональности разбиения на страницы, но это то, что у меня есть до сих пор:

func printScheduleView(schedule: [SchedSlot] ) {
    
    let printInfo = NSPrintInfo.shared
    printInfo.topMargin = 0.0
    printInfo.bottomMargin = 0.0
    printInfo.rightMargin = 0.0
    printInfo.leftMargin = 0.0
    
    printInfo.horizontalPagination = .fit
    printInfo.verticalPagination = .automatic
    printInfo.isHorizontallyCentered = false
    printInfo.isVerticallyCentered = false

    let view = ScheduleDisplayView(schedule: schedule)
    let contentRect = NSRect(x: 0, y: 0, width: 900, height: 2800)

    let viewToPrint = NSHostingView(rootView: view)
    viewToPrint.frame = contentRect

    let bitMap = viewToPrint.bitmapImageRepForCachingDisplay(in: contentRect)!
    viewToPrint.cacheDisplay(in: contentRect, to: bitMap)

    let image = NSImage(size: bitMap.size)
    image.addRepresentation(bitMap)

    let imageView = NSImageView(frame: contentRect)
    imageView.image = image

    let printOperation = NSPrintOperation(view: imageView, printInfo: printInfo)
    printOperation.showsPrintPanel = true
    printOperation.showsProgressPanel = true
    printOperation.run()
    
}
printing swift truncation view
2021-11-23 17:18:45
1

Лучший ответ

0

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

2021-11-24 19:37:48

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................