Tout d'abord, je m'excuse pour le manque d'images. Apparemment, je suis encore trop nouveau ici pour le faire. Je vais tenter de décrire le problème verbalement, et de fournir les deux principaux morceaux de code.
Je suis de l'impression d'un programme tv, avec des rangées de slots de temps. Lorsque j'affiche la vue de mon macos écran, il ressemble à quelque chose comme ceci:
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
Mais quand je l'imprimer, il tronque certains, mais pas nécessairement toutes les deux en ligne des éléments de texte, comme ceci:
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 vous constatez une incohérence, c'est parce qu'il n'est pas totalement cohérents. Parfois, je fais les deux en ligne de sortie, mais le plus souvent je obtenir la troncation avec les points de suspension. Je n'ai pas trouvé le modèle sous-jacent pourquoi. Mais seulement dans le print frame est-ce un problème. L'écran affiche exactement ce que je veux.
J'ai donc chassé autour de solutions, et ont essayé de nombreuses variantes du Texte() modificateurs fixedSize() et lineLimit(). fixedSize sorte de travaux, en ce que les deux éléments de ligne de ne pas tronquer, mais encore une fois, dans la vue d'impression, la ligne du haut de la cellule clips les lignes au-dessus et au-dessous. C'est vraiment à agir comme les NSRect le cadrage de l'image à imprimer n'est tout simplement pas assez grand, mais il est énorme, et cela ne devrait pas se produire.
Le projet est trop gros pour fournir tout le code, mais j'espère que ce sera assez pour fournir le point de vue en question, en plus de l'imprimante logique.
Le point de Vue (ce qui s'affiche correctement - pas de troncature):
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)
}
}
}
}
}
}
Et c'est ici la fonction d'impression. Il manque encore la pagination de la fonctionnalité, mais c'est ce que j'ai obtenu jusqu'à présent:
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()
}