Pourquoi mon NSPrintOperation de l'image imprimée de tronquer mon Texte() voir, mais mon image de l'écran affiche le même Texte exact des vues un peu fine

0

La question

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()
    
}
printing swift truncation view
2021-11-23 17:18:45
1

La meilleure réponse

0

Le problème était lié à mon utilisation de la vue Liste. Il semble que les limites de la verticale de défilement de la fenêtre en quelque sorte importés dans l'imprimante de la fonction et de compresser l'image d'impression verticale de l'espace. C'est pourquoi il y avait une telle différence entre l'écran vs l'imprimante version du même point de vue exact. Je "fixe" par le remplacement de la Liste avec un VStack. Pas plus de troncature qui se passe.

2021-11-24 19:37:48

Dans d'autres langues

Cette page est dans d'autres langues

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