概述
在macOS开发中,我们可能有需求是要打印我们编辑框输入的文本,或者保存文本为PDF文档,这个功能只需要调用系统的打印功能就可以实现了,不需要特殊的实现方式。
实现方式
首先需要定义一下NSPrintInfo,它可以控制页面的大小,边距等一些属性,然后我们需要将我们swiftUI上的view转化为NSView,这里就用到了NSHostingView。下面直接上代码:
let printInfo: NSPrintInfo = NSPrintInfo()
let baseMargin: CGFloat = 20.0;
printInfo.paperSize = NSMakeSize(595, 842);
printInfo.paperName = NSPrinter.PaperName.init("A4")
printInfo.topMargin = baseMargin
printInfo.leftMargin = baseMargin
printInfo.rightMargin = baseMargin
printInfo.bottomMargin = baseMargin
let height = editBoxContent.getheightForComment(fontSize: 12, width: 535)
let view = NSHostingView(rootView: PrintView(text: editBoxContent))
view.frame.size = CGSize(width: 535, height: height+20)
let printOp: NSPrintOperation = NSPrintOperation(view: view, printInfo: printInfo)
printOp.showsPrintPanel = true
printOp.showsProgressPanel = true
printOp.run()
扩展String的方法用于计算文本所占高度:
extension String {
func getheightForComment(fontSize: CGFloat, width: CGFloat) -> CGFloat {
let font = NSFont.systemFont(ofSize: fontSize)
let rect = NSString(string: self).boundingRect(with: CGSize(width: width, height: CGFloat(MAXFLOAT)), options: .usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: font], context: nil)
return ceil(rect.height)
}
}
效果
调用后的效果,就是弹出系统的打印窗口,左边为预览效果,可以通过底部下拉菜单选择预览或者保存为PDF形式。  注意这个打印功能需要在沙盒权限中勾选打印。
|