护照APP开发:按英寸尺寸设置UIView与Image大小及适配问题
解决纸张尺寸超设备屏幕问题
放弃直接用不可滚动的CollectionView承载超大纸张布局,改用UIScrollView作为外层容器,内部放置一个UIView(命名为paperContainer)作为纸张载体。先按英寸转像素的规则计算真实纸张尺寸:用设备的nativeScale(每英寸像素数)乘以纸张英寸尺寸,比如A4 8.5×11英寸,转换后像素尺寸为8.5 * UIScreen.main.nativeScale×11 * UIScreen.main.nativeScale。将paperContainer的frame设为该尺寸,把所有调整好大小的护照照片按计算好的行列数布局到paperContainer上,最后把UIScrollView的contentSize设为paperContainer的尺寸,让用户可以滑动缩放查看完整纸张。满足无滚动+截图打印需求
如果坚持用CollectionView,直接把CollectionView的frame设置为计算后的完整纸张像素尺寸,禁用其自身滚动(isScrollEnabled = false),再把它放进UIScrollView里供用户浏览。截图时不要截取屏幕,直接截取整个CollectionView的内容,代码示例:// 计算纸张与照片的像素尺寸 let scale = UIScreen.main.nativeScale let photoSize = CGSize(width: 2 * scale, height: 2 * scale) let paperSize = CGSize(width: 8.5 * scale, height: 11 * scale) // 设置CollectionView尺寸为完整纸张大小 collectionView.frame = CGRect(origin: .zero, size: paperSize) collectionView.isScrollEnabled = false // 截图整个CollectionView用于打印 UIGraphicsBeginImageContextWithOptions(paperSize, false, scale) collectionView.drawHierarchy(in: collectionView.bounds, afterScreenUpdates: true) let printImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext()行列数与布局优化
计算每行/列照片数量时,用纸张英寸尺寸除以照片英寸尺寸取整,比如8.5英寸宽÷2英寸=4张/行,11英寸高÷2英寸=5张/列。剩余的留白可以均匀分配到照片间距和纸张边缘,确保布局整齐。比如横向留白8.5-4×2=0.5英寸,可分为左右各0.25英寸边距,或者在照片间均分。
内容的提问来源于stack exchange,提问作者muhammad Zoraiz

