PDFView setNeedsDisplay: ДА не работает на MacOS Sierra 10.12
У меня есть использование [PDFView setNeedsDisplay:YES]
чтобы перерисовать PDF, и он отлично работал на OSX 10.9-10.11. Однако это не будет работать, если я не увеличу или уменьшу страницу PDF...
Есть ли другой способ перерисовать сразу? Код ниже:
NSRect newBounds;
NSRect currentBounds;
NSRect dirtyRect;
NSPoint mouseLoc;
NSPoint endPt;
// Where is annotation now?
currentBounds = [_activeAnnotation bounds];
// Mouse in display view coordinates.
mouseLoc = [self convertPoint: [theEvent locationInWindow] fromView: NULL];
// Convert end point to page space.
if(activePage == nil)
activePage =[_activeAnnotation page];
_LinePoint= [self convertPoint: mouseLoc toPage: activePage];
endPt = [self convertPoint: mouseLoc toPage: activePage];
if(_selectedIdx == 3) //ink
{
[(PDFAnnotationInk*)_activeAnnotation removeBezierPath:_path];
//endPt.x=_xPoint.x; //竖线
//endPt.y=_xPoint.y; //横线
[_path lineToPoint:endPt]; // 普通笔
[(PDFAnnotationInk*)_activeAnnotation addBezierPath:_path];
[self annotationChanged];
[self setNeedsDisplay:YES];
return;
ОБНОВЛЕНИЕ:
Я обнаружил, что setNeedsDispaly
вызывает drawPage:toContext:
Однако код рисования не работает в drawPage:toContext:
- (void)drawPage:(PDFPage *)pdfPage toContext(CGContextRef)context
{
[super drawPage: pdfPage toContext:context];
NSBezierPath *line=[NSBezierPath bezierPath];
[line moveToPoint:_xPoint];
[line lineToPoint:NSMakePoint(150, 150)];
[[NSColor redColor] set];
[line setLineWidth:50] ;
[line stroke];
}
сказал отладчик CGContextSetFillColorWithColor: invalid context 0x0
и больше invalid context 0x0
предупреждения. Что я делаю в drawPage:toContext:
тестирует и просто использует BezierPath, чтобы нарисовать линию.
1 ответ
У меня такая же проблема. В первый раз я добавляю аннотацию, PDFView
немедленно отображает эту аннотацию на странице. С этого момента добавление или удаление аннотации прекрасно работает в коде, но PDFView
не показывает изменения, пока я не прокручиваю вид вручную.
От PDFKit
Я пробовал:
previewView.layoutDocumentView()
for pageIndex in 0...pdf.pageCount - 1 {
let page = pdf.page(at: pageIndex)!
previewView.annotationsChanged(on: page)
}
и из NSView
Я пробовал:
previewView.needsDisplay = true
previewView.needsLayout = true
previewView.documentView?.needsDisplay = true
previewView.updateLayer()
но не повезло. Я пытался прокрутить PDFView
с кодом тоже, но это не был надежный способ подделать обновление, и в целом не должно быть способом сделать это.