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