Dlaczego mój obraz drukowany NSPrintOperation obcina mój wygląd tekstu (), ale obraz na ekranie wyświetla te same dokładne informacje prezentacji

0

Pytanie

Po pierwsze, przepraszam za brak zdjęć. Oczywiście, nadal jestem zbyt początkujący tutaj, aby to zrobić. Postaram się opisać problem ustnie i podam dwa kluczowe fragmentu kodu.

Piszę telewizyjny rozkład z rzędami interwałów czasowych. Kiedy отображаю widok na ekranie macos, to wygląda mniej więcej tak:

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 gdy wpisuję go, on obcina niektóre, ale nie koniecznie wszystkie двухстрочные elementy tekstowe, na przykład tak:

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

Jeśli zauważysz niezgodność, to dlatego, że ja nie do końca konsekwentne. Czasami dostaję wniosek w dwie linie, ale coraz częściej dostaję obcinania wielokropka. I nie rozumiem, co jest powodem, leżąca w podstawie. Ale tylko w ramce druku to jest problem. Na ekranie pojawi się dokładnie to, co chcę.

Więc poszukałem rozwiązania i próbowałem wiele opcji modyfikatorów Text() FixedSize() i lineLimit(). FixedSize działa tak, że elementy z dwóch wierszy nie są obcinane, ale znowu, w trybie drukowania wiersz z dużą komórką przycina linie powyżej i poniżej niej. To naprawdę wygląda na to, że NSRect, обрамляющий obraz wydrukowany, po prostu nie jest wystarczająco duży, ale jest ogromny, i nie powinno się dziać.

Projekt jest zbyt duży, aby zapewnić cały kod, ale mam nadzieję, że będzie wystarczająco dużo, aby zapewnić przedmiotowe przedstawienie plus logiki drukarki.

Poddanie (to wyświetla się poprawnie - bez obcinania):

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 oto i funkcja drukowania. Mu jeszcze brakuje funkcjonalności podział na strony, ale to jest to, co mam do tej pory:

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

Najlepsza odpowiedź

0

Problem był związany z moim użyciu widoku listy. Wygląda na to, że ograniczenia okna pionowego przewijania w jakiś sposób są importowane do funkcji drukarki i kurczą się pionowa przestrzeń drukowanego obrazu. To dlatego była taka różnica między ekranem a wersją drukarki z jednym i tym samym dokładne odwzorowanie. Ja "załatwił" to, zastępując lista na VStack. Żadnego obcinania się nie dzieje.

2021-11-24 19:37:48

W innych językach

Ta strona jest w innych językach

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