当前位置: 首页 > wzjs >正文

网站开发验收模板友情链接的定义

网站开发验收模板,友情链接的定义,做同城购物网站有什么优势吗,哪个网站做调查赚钱多【IOS】【OC】【应用内打印功能的实现】如何在APP内实现打印功能,连接本地打印机,打印想打印的界面 设备/引擎:Mac(14.1.1)/cocos 开发工具:Xcode 开发语言:OC/C 开发需求:工程中…

【IOS】【OC】【应用内打印功能的实现】如何在APP内实现打印功能,连接本地打印机,打印想打印的界面

设备/引擎:Mac(14.1.1)/cocos

开发工具:Xcode

开发语言:OC/C++

开发需求:工程中需要为用户提供一个打印功能,让用户可以随时打印自己想要打印的界面

APP属于iOS工程,所以打印代码考虑直接用OC代码调用iOS原生界面就可以,很好用,也不用自己去写UI,也比较适合短周期开发的情况,话不多说,直接正文

1.打印代码
大致过程是这样的,OC代码判断获取到的图片信息是否合法,再调用iOS原生的打印控制器,判断是否有可用的打印机,最后用户点击打印即可……
获取图像部分

    @autoreleasepool {// 获取 Document 路径NSString* docsDir = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;NSString* imagePath = [docsDir stringByAppendingPathComponent:[NSString stringWithUTF8String:filename]];UIImage* image = [UIImage imageWithContentsOfFile:imagePath];if (!image) {NSLog(@"[PrintHelper] 图片未找到:%@", imagePath);return;}.........

Tips:整段代码用autoreleasepool包裹起来可以让其中的临时对象在代码块结束后及时释放,避免内存泄露

判断打印控制器是否可用并设置打印内容

        UIPrintInteractionController* printController = [UIPrintInteractionController sharedPrintController];if (!printController || ![UIPrintInteractionController canPrintData:UIImagePNGRepresentation(image)]) {NSLog(@"[PrintHelper] 当前设备无法打印图片。");return;}printController.printingItem = image; //设置打印内容

异步显示iOS原生打印对话框

dispatch_async(dispatch_get_main_queue(), ^{

弹出打印界面 + 打印结果回调

[printController presentAnimated:YES completionHandler:^(UIPrintInteractionController * _Nonnull controller, BOOL completed, NSError * _Nullable error) {if (error) {NSLog(@"[PrintHelper] 打印失败:%@", error.localizedDescription);} else if (completed) {NSLog(@"[PrintHelper] 打印完成。");} else {NSLog(@"[PrintHelper] 用户取消打印。");}
}];

至此iOS原生打印代码就算完成了

2.获取打印图片代码
这个就是你想打印的部分,我们的工程中涉及打印的就是涂色相关的玩法,所以有两种方法可以获取打印区域,一种是获取你需要打印的多个画布,将这些画布内容渲染出来保存为图片文件再打印;还有一种方法是直接对屏幕内容进行局部截图处理,将截好的图直接传过去进行打印
1)获取多个画布节点,将他们都渲染到一张新画布上,然后再打印出来
创建画布

   // 1. 创建一张足够大的 renderTextureCCSize targetSize = CCSizeMake(winSize.width, winSize.height); // 设置尺寸CCRenderTexture* rt = CCRenderTexture::create(targetSize.width, targetSize.height);rt->beginWithClear(1,1,1,1);  // 白底

获取多张ColoringClippingNode画布并渲染

   for (int i = 0; i < m_ClipDrawArray->count(); i++) {ColoringClippingNode* clip = (ColoringClippingNode*)m_ClipDrawArray->objectAtIndex(i);if (!clip) continue;// 保存原始位置CCPoint oldClipPos = clip->getPosition();// 计算偏移,使其居中绘制CCPoint centeredPos = ccp(winSize.width/2, winSize.height/2);if(i==0){clip->setPosition(ccp(winSize.width*0.65, winSize.height/2));}else{clip->setPosition(centeredPos);}// 直接visit整个clip节点,节点上的遮罩也会生效clip->visit();// 恢复原始位置clip->setPosition(oldClipPos);}

如果有需要渲染的sprite精灵也需要加进来

   auto sprite = whiteCanvas;if (sprite){// 保存auto oldA = sprite->getAnchorPoint();auto oldP = sprite->getPosition();// 设置锚点和位置到大图中心sprite->setAnchorPoint(ccp(0.5f,0.5f));sprite->setPosition(ccp(targetSize.width/2, targetSize.height/2));sprite->visit();// 恢复sprite->setAnchorPoint(oldA);sprite->setPosition(oldP);}

都渲染之后就是结束画布渲染

   rt->end();

保存渲染好的画布;调用打印代码

 rt->saveToFile("printScene.png", kCCImageFormatPNG);  //将画布保存为PNG并命名
// 延迟调用打印代码,避免未渲染保存就打印CCDirector::sharedDirector()->getScheduler()->scheduleSelector(schedule_selector(ColorCanvasView::callPrintImage),this, 0, 0, 0.3f, false);

以上就是通过将多张画布及精灵渲染到一张画布再保存成文件,最后打印的过程,下面再说说如何通过截屏操作来打印

2)对屏幕想要打印的区域进行截屏保存,再打印
截屏代码

   @autoreleasepool {// 获取根控制器和屏幕信息AppController *app = (AppController *)[UIApplication sharedApplication].delegate;UIViewController *viewController = [app viewController];UIView *targetView = viewController.view;CGFloat scale = [UIScreen mainScreen].scale;CGSize viewSize = targetView.bounds.size;
        // 1. 截屏UIGraphicsBeginImageContextWithOptions(viewSize, NO, scale);[targetView drawViewHierarchyInRect:CGRectMake(0, 0, viewSize.width, viewSize.height) afterScreenUpdates:YES];UIImage *fullImage = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();if (!fullImage) {NSLog(@"截屏失败");return;}
        // 2. 裁剪区域CGRect cropRect = CGRectMake(x * scale, y * scale, width * scale, height * scale);CGImageRef croppedCGImage = CGImageCreateWithImageInRect(fullImage.CGImage, cropRect);if (!croppedCGImage) {NSLog(@"裁剪失败");return;}UIImage *croppedImage = [UIImage imageWithCGImage:croppedCGImagescale:scaleorientation:fullImage.imageOrientation];CGImageRelease(croppedCGImage);CGSize targetSize = CGSizeMake(width, height);UIGraphicsBeginImageContextWithOptions(targetSize, NO, scale);

一般还是需要对截屏区域进行缩放,保证打印时图像大小位置合适
缩放居中代码

        CCSize winSizes = GameManager::sharedManager()->getViewVisibleSize();// 4. 缩放CGFloat shrinkScale = 0.85;CGFloat offX_x=0.3;CGSize scaledSize = CGSizeMake(croppedImage.size.width * shrinkScale, croppedImage.size.height * shrinkScale);// 5. 计算居中位置CGPoint origin = CGPointMake((targetSize.width - scaledSize.width) *offX_x, (targetSize.height - scaledSize.height) / 2.0);// 6. 居中绘制缩小后的图像[croppedImage drawInRect:CGRectMake(origin.x, origin.y, scaledSize.width, scaledSize.height)];// 7. 得到最终图像UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();

最后就是将图像保存为文件

        // 8. 保存图像到文件NSData *imageData = UIImagePNGRepresentation(finalImage);if (!imageData) {NSLog(@"图片数据为空");return;}NSString *docsDir = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;NSString *imagePath = [docsDir stringByAppendingPathComponent:[NSString stringWithUTF8String:filename]];if ([imageData writeToFile:imagePath atomically:YES]) {NSLog(@"图片保存成功:%@", imagePath);} else {NSLog(@"图片保存失败");}

以上就是如何通过OC代码来进行截屏操作,接下来就是在工程中如何调用

    float x = winSize.width*widthX_x; // 起始横坐标(point)float y = winSize.height*heightOffY; // 起始纵坐标(point)float w = winSize.width*widthOffX; // 宽度float h = winSize.height; // 高度const char* filename = "printScene.png";DeviceManager::sharedManager()->printSceneAddedToFile(filename, x, y, w, h);
// 延迟调用打印代码,避免未渲染保存就打印CCDirector::sharedDirector()->getScheduler()->scheduleSelector(schedule_selector(ColorCanvasView::callPrintImage),this, 0, 0, 0.3f, false);

以上就是如何通过截屏保存图片最后打印

上面两种方法都可以实现打印指定区域的效果,具体实现可以根据自身的项目需求来定

希望能给大家带来帮助!!!有什么问题不明白的需要讨论的都可以评论私信欢迎一起讨论~~~

http://www.dtcms.com/wzjs/527044.html

相关文章:

  • 佛山优秀网站建设品牌推广案例
  • 企业网站建设规划设计任务书东莞寮步最新通知
  • 网站子域名怎么做互联网营销培训课程
  • 网站建设教程流程武汉网站优化
  • 建设厅网站官网微商软文大全
  • WordPress怎么输入代码seo整站优化吧
  • 做书app下载网站有哪些内容新乡网站优化公司
  • 网站建设968营销软文网站
  • 免费素材网站mixkit百度公司招聘岗位
  • 南宁网站建设咨q479185700上墙重庆seo公司
  • 宁波网站建设怎么样网络营销的专业知识
  • 昆明建设路租房信息昆明租房网站营销策划公司取名大全
  • 官网网站设计嘉兴新站seo外包
  • web开发和做网站的区别如何实施网站推广
  • 服务网站 建设原则谷歌外贸seo
  • 网站主题旁边的图标怎么做的网页分析工具
  • 网站建设项目策划书格式企业qq官方下载
  • 龙岗网站制作公司一般多少钱seo外包服务公司
  • 猪价格今日猪价格全国走势seo推广岗位职责
  • 伊利网站设计四川聚顺成网络科技有限公司
  • 网站建设方案备案如何写软文赚钱
  • 企业网站运营问题b站怎么推广自己的视频
  • 橙子建站有风险吗seo优化是什么
  • 自己做的产品在哪个网站上可从卖网络推广方案的内容
  • 做初中试卷的网站竞价网络推广培训
  • 中国制造网网站建设的优势国内网络销售平台有哪些
  • 网站建设的制度太原seo网站优化
  • 建个网站有收网站推广app
  • 上海软件网站建设seo怎么快速提高排名
  • ps做的图怎么做成网站前端发稿吧