De ce mi-e NSPrintOperation imprimare imagine trunchiere Textul meu() vezi dar imaginea de pe ecran se afiseaza acelasi Text de vedere bine

0

Problema

În primul rând, îmi cer scuze pentru lipsa de imagini. Se pare că eu sunt încă prea nou aici pentru a face asta. Voi încerca să descrie problema verbal, și să ofere două piese-cheie de cod.

Sunt imprimarea unui program tv, cu rânduri de sloturi de timp. Când am afișa vederea mea macos ecran, se pare ceva de genul:

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

Dar când se imprimă, se trunchiază unii, dar nu neapărat toate de două-line a articolelor de text, astfel:

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

Dacă observați inconsecvență, pentru că nu este în întregime în concordanță. Uneori sunt două linii de ieșire, dar cel mai adesea am trunchiere cu puncte de suspensie. Nu mi-am dat seama de modelul de bază de ce. Dar numai în print frame este asta o problema. Ecranul afișează exact ce vreau.

Așa că am căutat în jurul pentru soluții, și-au încercat mai multe variante de Text() modificatori fixedSize() și lineLimit(). fixedSize fel de lucrări, în care cele două elemente de linie nu trunchia, dar, din nou, în vederea imprimării, de rând cu inaltime de celule clipuri rândurile de mai sus și de mai jos. Este într-adevăr acționează ca NSRect încadrarea imprima imaginea nu este destul de mare, dar e imens, iar acest lucru nu ar trebui să se întâmple.

Proiectul este prea mare pentru a oferi tot codul, dar sperăm că va fi suficient pentru a oferi opinia în cauză, plus imprimanta logica.

Vedere (aceasta afișează corect - nu trunchiere):

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

Și aici este funcția de imprimare. Este încă lipsit de paginare funcționalitate, dar e ceea ce am primit până acum:

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

Cel mai bun răspuns

0

Problema era legată de utilizarea Listei de vedere. Se pare limitările de derulare verticală fereastra cumva importate în funcția de tipărire și de a comprima imaginea de imprimare este spațiul vertical. Deci, de aceea nu a fost o astfel de diferență între ecran vs imprimanta versiune de exact același punct de vedere. M-am "fixat" prin înlocuirea Lista cu o VStack. Nu mai trunchiere se întâmplă.

2021-11-24 19:37:48

În alte limbi

Această pagină este în alte limbi

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