NSPrintOperation baskı resmim neden Text () görünümümü kesiyor, ancak ekran resmim aynı tam Metin görünümlerini görüntülüyor

0

Soru

Öncelikle görüntü eksikliğinden dolayı özür dilerim. Görünüşe göre bunu yapmak için hala çok yeniyim. Sorunu sözlü olarak tanımlamaya çalışacağım ve iki anahtar kod parçasını sağlayacağım.

Bir dizi zaman aralığı olan bir tv programı basıyorum. Görünümü macos ekranımda görüntülediğimde şöyle bir şeye benziyor:

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

Ancak yazdırdığımda, bazılarını keser, ancak mutlaka iki satırlık metin öğelerinin tümünü kesmez:

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

Tutarsızlığı fark ederseniz, bunun nedeni tamamen tutarlı olmamasıdır. Bazen iki satırlık çıktıyı alırım, ancak daha sık üç nokta ile kesmeyi alırım. Nedenini tam olarak çözemedim. Ancak bu yalnızca yazdırma çerçevesinde bir sorundur. Ekran tam olarak ne istediğimi gösteriyor.

Bu yüzden çözümler için avlandım ve Text() değiştiricilerinin fixedSize() ve lineLimit () birçok varyasyonunu denedim. fixedSize, iki satırlı öğelerin kesilmemesi için çalışır, ancak yine de yazdırma görünümünde, uzun hücreye sahip satır, üstündeki ve altındaki satırları kırpar. Gerçekten baskı görüntüsünü çerçeveleyen Nsrect'in yeterince büyük olmadığı gibi davranıyor, ama çok büyük ve bu olmamalı.

Proje tüm kodu sağlamak için çok büyük, ancak umarım söz konusu görünümü ve yazıcı mantığını sağlamak için yeterli olacaktır.

Görünüm (bu doğru şekilde görüntülenir-kesme yok):

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

Ve işte baskı işlevi. Ne var bende hala sayfa işlevsellik eksik, ama şimdiye kadar bu kadar:

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

En iyi cevabı

0

Sorun, Liste görünümünü kullanmamla ilgiliydi. Dikey kaydırma penceresinin sınırlamaları bir şekilde yazıcı işlevine içe aktarılıyor ve baskı görüntüsünün dikey alanını sıkıştırıyor gibi görünüyor. Bu yüzden ekran ile aynı görünümün yazıcı sürümü arasında böyle bir fark vardı. Listeyi bir VStack ile değiştirerek 'düzelttim'. Artık kesilme olmuyor.

2021-11-24 19:37:48

Diğer dillerde

Bu sayfa diğer dillerde

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