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