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