왜 내 NSPrintOperation 인쇄 이미지를 잘라내기 내(텍스트)보기만 내 화면 이미지를 표시하고 동일한 정확한 텍스트 정밀

0

질문

첫째,내가 사과에 대한 이점 유의하여 주시기 바랍니다. 분명히 난 아직도 너무 새하려면 여기십니다. 나는 설명하려고 시도하는 문제,구두고 제공하는 두 가지 주요 부분의 코드입니다.

나는 인쇄 tv schedule,의 행이 있습니다. 때 나는 전망을 내 macos 화면 다음과 같이 나타납니다.

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

하지만 내가 그것을 인쇄,그것을 잘라내는 일부지만,반드시 모든 두 개의 라인 텍스트 항목은 다음과 같이:

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

당신이 통지하는 경우 일관성,그의하지 않기 때문에 완전히 일치한다. 때때로 내가 할인 출력하지만,더 자주 나이 잘과 생략. 나는지 알아낸 근본적인 패턴 이유. 하지만 인쇄에서 프레임이 이 문제입니다. 화면 표시 정확히 무엇을 원하는.

그래서 나는 사냥 주위의 솔루션을 위한,그리고 많은 변화의 텍스트()수정 fixedSize()및 lineLimit(). fixedSize 종류의 작품에서는 두 개의 라인 항목은 잘리지 않지만,다시서,인쇄,보기 행 높이 세포 클립 행을 위 아래습니다. 그것은 정말처럼 행동합 NSRect 프레임의 인쇄 이미지는 크지 않다,하지만 그것은 거대하고,이 해서는 안됩니다.

프로젝트가 너무 큰을 제공하는 모든 코드,하지만 희망이 될 것입 제공하기 위하여 충분히 보기 질문에 플러스,프린터의 논리입니다.

View(이 올바르게 표시됩-더 잘라내기):

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

그리고 여기에 인쇄하는 기능입니다. 그것은 여전히 부족한 매김 기능,그러나 그것은 내가 지금까지:

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

최고의 응답

0

문제와 관련된 내용의 목록을 볼 수 있습니다. 그것은 나의 제한 수직 스크롤 창은 어떻게든 얻을 수입으로 프린터 기능 및 압축하면 인쇄 이미지의 수직 공간입니다. 그래서 그 이유가 사이에 차이가 화면을 대 프린터 같은 정확한 보기입니다. I'고정'그것을 대체해서 목록으로 VStack. 는 더 잘 일어나고 있다.

2021-11-24 19:37:48

다른 언어로

이 페이지는 다른 언어로되어 있습니다

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