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