Nic*_*nov 2 core-graphics uiview ios cgpdf swift
我正在开发一个应用程序,我想在UICollectionView上实现PDF阅读器.
我在每个单元格上使用自定义UIView,呈现相应的PDF页面:
weak var page: CGPDFPage! {
didSet { setNeedsDisplay() }
}
override func draw(_ rect: CGRect) {
if page == nil {
print("page is nil")
return }
let context = UIGraphicsGetCurrentContext()
context?.clear(bounds)
context?.setFillColor(red: 1, green: 1, blue: 1, alpha: 1)
context?.fill(bounds)
context?.translateBy(x: 0.0, y: bounds.size.height);
context?.scaleBy(x: 1.0, y: -1.0);
var cropBox = page.getBoxRect(.cropBox)
cropBox = CGRect(x: cropBox.origin.x, y: cropBox.origin.y, width: ceil(cropBox.width), height: ceil(cropBox.height))
let scaleFactor = min(bounds.size.width/cropBox.size.width, bounds.size.height/cropBox.size.height)
let scale = CGAffineTransform(scaleX: scaleFactor, y: scaleFactor)
let scaledInnerRect = cropBox.applying(scale)
let translate = CGAffineTransform(translationX: ((bounds.size.width - scaledInnerRect.size.width) / 2) - scaledInnerRect.origin.x, y: ((bounds.size.height - scaledInnerRect.size.height) / 2) - scaledInnerRect.origin.y)
let concat = translate.scaledBy(x: scaleFactor, y: scaleFactor)
context?.concatenate(concat)
let clipRect = cropBox
context?.addRect(clipRect)
context?.clip()
context?.drawPDFPage(page)
UIGraphicsEndPDFContext()
}
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.它在单元格上呈现页面,但它会导致内存问题.
以某种方式,上下文保持对集合视图的单元格上呈现的所有页面的引用,并且它们不会被释放.CGPDFPageRelease不再可用.:(
另一方面,如果这个uiview子类在scrollview中缩放,我怎么能重绘pdf所以我不会失去质量?
任何帮助将受到高度赞赏.谢谢!
我有相同的代码和相同的问题,但一旦我改为这个新的解决方案,它帮助了我.现在,渲染PDF时我的内存没有任何问题.
autoreleasepool非常重要,因为它可以帮助您释放渲染的页面.这是我的代码.
迅速
class PDFPageRenderView: UIView {
func render(page: CGPDFPage) {
for subview in subviews { subview.removeFromSuperview() }
let imageView = UIImageView(frame: bounds)
imageView.contentMode = .scaleAspectFit
imageView.clipsToBounds = true
imageView.backgroundColor = UIColor.white
autoreleasepool {
let pageRect = page.getBoxRect(.mediaBox)
let renderer = UIGraphicsImageRenderer(size: pageRect.size)
let data = renderer.jpegData(withCompressionQuality: kImageCompression, actions: { cnv in
UIColor.white.set()
cnv.fill(pageRect)
cnv.cgContext.translateBy(x: 0.0, y: pageRect.size.height)
cnv.cgContext.scaleBy(x: 1.0, y: -1.0)
cnv.cgContext.drawPDFPage(page)
})
imageView.image = UIImage(data: data)
}
addSubview(imageView)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
642 次 |
| 最近记录: |