I'm trying to add text widgets to my pdf using IOS PDFKIT.
So to achieve that goal I'm using the PDFAnnottaion
class.
My issue is that after adding multiples annotations (something like 15) my app is facing a big performance issue because of ram usage that is leading to its crash if I add more annotations. This is the error message when my app crashes:
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BREAKPOINT (code=1, subcode=0x190f1b22c)
frame #0: 0x0000000190f1b22c CoreFoundation`CFRelease.cold.1 + 16
CoreFoundation`CFRelease.cold.1:
-> 0x190f1b22c <+16>: brk #0x1
CoreFoundation`__CFStringCollectionCopy.cold.1:
0x190f1b230 <+0>: adrp x8, 347691
0x190f1b234 <+4>: adrp x9, 482
0x190f1b238 <+8>: add x9, x9, #0xab2 ; =0xab2
Target 0: (Runner) stopped.
The error message make me think that the error is memory related but I'm not sure.
Below you will be able to find the code I'm using to create and add my annotation :
CGSize newSize = CGSizeMake(_pointer.size.width * pointerScale,_pointer.size.height * pointerScale);
CGRect parentRect = _pdfView.bounds;;
double x = parentRect.size.width / [observation.xScale doubleValue] ;
double y = parentRect.size.height / [observation.yScale doubleValue];
PDFAnnotation * observationText = [[PDFAnnotation alloc] initWithBounds:CGRectMake(x + newSize.width /2 ,y + newSize.height /2 ,10, 10) forType: PDFAnnotationSubtypeText withProperties: nil];;
observationText.contents = [NSString stringWithFormat:@"%@", observation.observationId];
observationText.fontColor = UIColor.blackColor;
observationText.color = UIColor.clearColor;
if(_pdPage != nil){
[_pdPage addAnnotation:observationText];
observation.textAnnotation = observationText;
}
This is how I load my pdf :
if ([filePath isKindOfClass:[NSString class]]) {
NSURL * sourcePDFUrl = [NSURL fileURLWithPath:filePath];
PDFDocument * document = [[PDFDocument alloc] initWithURL: sourcePDFUrl];
if (document == nil) {
NSLog(@"cannot create document: File not in PDF format or corrupted.");
} else {
_pdfView.autoresizesSubviews = YES;
_pdfView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
_pdfView.backgroundColor = [UIColor colorWithWhite:0.95 alpha:1.0];
_pdfView.displayDirection = kPDFDisplayDirectionVertical;
_pdfView.displayMode = kPDFDisplaySinglePage;
_pdfView.document = document;
PDFPage* page = [document pageAtIndex:0];
_pdPage = page;
UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action: @selector(onTap:)];
UILongPressGestureRecognizer * longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action: @selector(longPress:)];
tapGesture.numberOfTapsRequired = 1;
tapGesture.numberOfTouchesRequired = 1;
[_pdfView addGestureRecognizer:tapGesture];
[_pdfView addGestureRecognizer:longPressGesture];
movedObservation = nil;
[_pdfView goToPage: page];
CGRect pageRect = [page boundsForBox:[_pdfView displayBox]];
CGRect parentRect = [[UIScreen mainScreen] bounds];
if (frame.size.width > 0 && frame.size.height > 0) {
parentRect = frame;
}
CGFloat scale = 1.0f;
if (parentRect.size.width / parentRect.size.height >= pageRect.size.width / pageRect.size.height) {
scale = parentRect.size.height / pageRect.size.height;
} else {
scale = parentRect.size.width / pageRect.size.width;
}
NSLog(@"scale %f", scale);
_pdfView.scaleFactor = scale;
_pdfView.minScaleFactor = scale;
_pdfView.maxScaleFactor = 4.0;
for(Observation * observation in _observations) {
[self drawObservation:observation];
}
}
}
So does someone has an idea why I'm facing this performance issues ? Am I initializing the wrong way my annotations ?