2016-11-01 3 views
1

В настоящее время я разрабатываю приложение, и я хочу реализовать программу чтения PDF поверх UICollectionView.CGPDFPage Рисунок вызывает проблемы с памятью (Swift 3)

Я использую пользовательский 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() 

} 

До сих пор так хорошо. Он отображает страницу в ячейке, но это вызывает проблему с памятью.

enter image description here

Как-то контекст хранит ссылки на все страницы, оказываемые на клетках зрения сбора и они не получают освобождаться. CGPDFPageRelease больше не доступен. :(

С другой стороны, если этот UIView подкласс масштабируется внутри Scrollview как можно перекроить PDF, так что я не потерять качество?

Любая помощь будет высоко оценен. Спасибо!

ответ

0

Мы видели такую ​​же утечку, и это только влияет на IOS 10. Кажется, это обычная проблема: https://forums.developer.apple.com/message/174710#174710 Мы также протестировали ее в iOS 10.2 и больше не можем найти утечку. Вы пытались увидеть, для вас?

+0

Я только что создал класс рендеринга в Obj-C .. и он работал большой –

0

Использование CATiledLayer для решения проблемы рендеринга при масштабировании страницы.

Создать подкласс CATiledLayer и переопределить ниже данного метода в вашем просмотра подкласса

override class var layerClass: AnyClass { 
     get { 
      return YourCATiledLayerSubclass.self 
     } 
    }