Perché è il mio NSPrintOperation immagine di stampa di troncare il mio Testo() vista ma la mia immagine sullo schermo viene visualizzato il stesso esatto Testo di vista proprio bene

0

Domanda

Innanzitutto, mi scuso per la mancanza di immagini. A quanto pare sono ancora troppo nuovo qui per questo. Tenterò di descrivere il problema verbalmente, e fornire i due pezzi di codice chiave.

Sto stampando un programma tv, con righe di slot. Quando ho visualizzato la vista al mio macos schermo, sembra qualcosa di simile a questo:

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

Ma quando sono la stampa, tronca, ma non necessariamente tutte le due linee di elementi di testo, in questo modo:

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

Se si nota l'incoerenza, perché non è del tutto coerente. A volte faccio la due-uscita di linea, ma più spesso mi capita di ottenere il troncamento con i puntini di sospensione. Non ho capito il modello sottostante il perché. Ma solo in print frame è un problema. Lo schermo visualizza esattamente quello che voglio.

Così ho cacciato in giro per le soluzioni, e ho provato molte varianti del Testo() modificatori fixedSize() e lineLimit(). fixedSize sorta di opere, in quanto i due elementi della riga di troncare, ma ancora una volta, in la stampa, la riga con le cellule alte clip le righe sopra e sotto. È davvero agire come il NSRect inquadratura l'immagine di stampa semplicemente non è abbastanza grande, ma è enorme, e questo non dovrebbe accadere.

Il progetto è troppo grande per fornire tutto il codice, ma speriamo che sia sufficiente per fornire la visualizzazione in questione, più la stampante logica.

La Vista (visualizza correttamente - nessun troncamento):

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)
                    }
                }
            }
        }
    }
}

E qui è la funzione di stampa. È ancora privo di impaginazione di funzionalità, ma è quello che ho ottenuto finora:

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

Migliore risposta

0

Il problema era legato al mio utilizzo della visualizzazione Elenco. Sembra che le limitazioni di scorrimento verticale della finestra di ottenere in qualche modo importati in funzione di stampante e comprimere l'immagine di stampa verticale di spazio. Ecco perché c'è una tale differenza tra lo schermo vs la stampante che è la versione esatta visione. Ho 'risolto' che sostituendo la Lista con un VStack. Non più di troncamento sta accadendo.

2021-11-24 19:37:48

In altre lingue

Questa pagina è in altre lingue

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