Proč je můj NSPrintOperation print image ořezávání můj Text() názor, ale můj obraz na obrazovce je zobrazení stejné zobrazení Textu v pohodě

0

Otázka

Za prvé, omlouvám se za nedostatek obrázků. Zřejmě jsem na to ještě příliš nový na to. Pokusím se problém popsat slovně, a poskytují dvě klíčové části kódu.

Jsem tisk tv schedule, s řadami časové sloty. Když jsem displej na zobrazení macos obrazovce, to vypadá nějak takhle:

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

Ale když jsem vytisknout to, že to zkrátí některé, ale ne nutně všechny dvou-line text položky, jako:

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

Pokud si všimnete nesrovnalosti, protože to není zcela konzistentní. Někdy mám dva-line výstup, ale častěji jsem se zkrácení s tečkami. Ještě jsem nepřišel na základní vzor, proč. Ale pouze v print frame je to problém. Displej zobrazuje přesně to, co chci.

Tak jsem se honili kolem řešení, a vyzkoušeli mnoho variant Text() modifikátory fixedSize() a lineLimit(). fixedSize druh prací, ve které dva-řádkové položky, ne zkrátit, ale zase, v tisku, v zobrazení řádku s vysoký mobilní klipy řádky nad a pod ním. Je to opravdu působí jako NSRect rámování tisk obrázku prostě není dost velký, ale to je obrovský, a to by nemělo být děje.

Projekt je příliš velká, aby poskytnout všechny kód, ale snad to bude stačit, aby poskytovaly zobrazení v otázce, plus tiskárna logiku.

Názor (to zobrazuje správně - žádné zkrácení):

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

A zde je funkce tisku. Je to stále chybí stránkování funkčnost, ale to, co jsem se dostal tak daleko:

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

Nejlepší odpověď

0

Byl problém týkající se mého použití Seznamu zobrazení. Zdá se, že omezení vertikální scroll okno nějak dostat dovážené do funkce tiskárny a stlačte tisk obrázku je vertikální prostor. Takže to je důvod, proč tam byl takový rozdíl mezi screen vs tiskárny verze stejný názor. Jsem "pevné", že nahradí Seznam s VStack. Žádné další zkrácení děje.

2021-11-24 19:37:48

V jiných jazycích

Tato stránka je v jiných jazycích

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