swiftUI之macOS下如何调用系统打印功能

swiftUI之macOS下如何调用系统打印功能

概述

在macOS开发中,我们可能有需求是要打印我们编辑框输入的文本,或者保存文本为PDF文档,这个功能只需要调用系统的打印功能就可以实现了,不需要特殊的实现方式。

实现方式

首先需要定义一下NSPrintInfo,它可以控制页面的大小,边距等一些属性,然后我们需要将我们swiftUI上的view转化为NSView,这里就用到了NSHostingView。下面直接上代码:

 let printInfo: NSPrintInfo = NSPrintInfo()
        let baseMargin: CGFloat    = 20.0;
        //A4纸的大小
        printInfo.paperSize  = NSMakeSize(595, 842);
        printInfo.paperName = NSPrinter.PaperName.init("A4")
        printInfo.topMargin    = baseMargin
        printInfo.leftMargin   = baseMargin
        printInfo.rightMargin  = baseMargin
        printInfo.bottomMargin = baseMargin
        //这里是计算文本的高度,因为打印出来必须先要设置frame的大小,不然会显示不全。
        let height = editBoxContent.getheightForComment(fontSize: 12, width: 535)
        //为自定义的打印view,可以自己实现,这个就不放出来了,哪怕放个Text也可以。
        let view = NSHostingView(rootView: PrintView(text: editBoxContent))
        //方法计算出来的高度来设置size,设置一点冗余量,却不所有文本都能打印出来
        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形式。
打印弹窗
注意这个打印功能需要在沙盒权限中勾选打印。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值