¿Por qué mi NSPrintOperation de la imagen de impresión de truncar mi Texto() de la vista, pero a mi la imagen de la pantalla se muestra el mismo Texto exacto de las vistas bien

0

Pregunta

En primer lugar, pido disculpas por la falta de imágenes. Al parecer, todavía soy muy nuevo aquí para hacer eso. Voy a intentar describir el problema de forma verbal, y proporcionar a las dos piezas clave de código.

Estoy imprimiendo un horario de tv, con filas de ranuras de tiempo. Cuando me visualización de la vista a mis macos pantalla, se ve algo como esto:

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

Pero cuando voy a imprimir, se trunca algunos, pero no necesariamente todos los de las dos de la línea de elementos de texto, así:

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

Si el aviso de la inconsistencia, esto debido a que no es totalmente coherente. A veces me pongo a las dos de la línea de salida, pero más a menudo me sale el truncamiento con los puntos suspensivos. No he descubierto el patrón subyacente de por qué. Pero sólo en la impresión de marco es este un problema. La pantalla muestra exactamente lo que quiero.

Así que he cazado alrededor de las soluciones, y han intentado muchas variaciones del Texto() modificadores fixedSize() y lineLimit(). fixedSize tipo de obras, en la que los dos elementos de línea no truncar, pero, de nuevo, en la vista de impresión, la fila con la altura de la célula clips de las filas de arriba y de abajo. Es realmente actuando como el NSRect encuadre de la impresión de la imagen no es lo suficientemente grande, pero es enorme, y esto no debería estar sucediendo.

El proyecto es demasiado grande para proporcionar todo el código, pero espero que sea suficiente para proporcionar la vista en cuestión, además de la impresora lógica.

La Vista (esto se muestra correctamente - no truncamiento):

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

Y aquí es la función de impresión. Es que todavía carecen de la funcionalidad de paginación, pero es lo que tengo hasta ahora:

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

Mejor respuesta

0

El problema estaba relacionado con el uso que hago de la vista de Lista. Parece que las limitaciones del desplazamiento vertical de la ventana de alguna manera se importen en la impresora de la función y comprimir la imagen de impresión vertical del espacio. Así que por eso no había una diferencia entre la pantalla de vs la impresora versión de la misma vista. I 'fijo' mediante la sustitución de la Lista con un VStack. No más de truncamiento que está sucediendo.

2021-11-24 19:37:48

En otros idiomas

Esta página está en otros idiomas

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