【问题标题】:PDFView in Mavericks does not "Automatically scale" and always shows scrollbarMavericks 中的 PDFView 不会“自动缩放”并始终显示滚动条
【发布时间】:2016-12-23 00:01:44
【问题描述】:

我正在创建一个 OSX PDF 查看器应用程序。底部有一个水平滚动条,因此用户可以轻松地在页面之间滚动。滚动时会有一个小预览窗口显示该页面的预览。这在 OSX 10.7 和 10.8 下运行良好,但在 Mavericks 10.9 中,“自动缩放”选项似乎失去了它的效果。还有一个滚动条(即使将比例设置为不需要滚动条的值)。

关于如何解决这个问题的任何想法?

OSX 10.7 和 10.8:

OSX 小牛队:

设置视图的代码:

- (void)awakeFromNib
{
    [super awakeFromNib];

    [_pdfView setAutoScales:YES];
    [_pdfView setDisplayMode:kPDFDisplayTwoUp];
    [_pdfView setDisplaysPageBreaks:NO];
    [self setWantsLayer:YES];
}

- (void)drawRect:(NSRect)dirtyRect
{
    [super drawRect:dirtyRect];

    CGContextRef context = (CGContextRef) [[NSGraphicsContext currentContext] graphicsPort];
    CGContextSetRGBFillColor(context, 0.227,0.251,0.337,0.8);
    CGContextFillRect(context, NSRectToCGRect(dirtyRect));
}

来自po [self.previewView _subtreeDescription]的视图结构:

$0 = 0x0000000113dcd280 [   A     WLU#] h=&-& v=--& IBPreviewView 0x119554760 f=(730.097,47,300,200) b=(-) => <_NSViewBackingLayer: 0x110a5b800> TIME drawRect: min/mean/max 0.00/0.00/0.00 ms
  [      O  WlU ] h=-&- v=-&- PDFView 0x104cb9c20 f=(10,60,280,130) b=(-) => <_NSViewBackingLayer: 0x114e311a0> TIME drawRect: min/mean/max 0.00/0.00/0.00 ms
    [   AF O  wlU ] h=--- v=--- PDFViewScrollView 0x110a36c60 f=(0,0,280,130) b=(-) => <_NSViewBackingLayer: 0x110a374a0> TIME drawRect: min/mean/max 0.00/0.00/0.00 ms
      [   AF O  wlU ] h=--- v=--- PDFCenteringClipView 0x110a2ba30 f=(0,0,265,130) b=(0.5,0,-,-) => <_NSClipViewBackingLayer: 0x110a42b70> TIME drawRect: min/mean/max 0.00/0.00/0.00 ms
        [   AF O  WLU ] h=--- v=--- PDFMatteView 0x110a28730 f=(0,0,980,683) b=(-) => <_NSViewBackingLayer: 0x110a3b600> TIME drawRect: min/mean/max 0.00/0.00/0.00 ms
          [   A      LU ] h=--- v=--- PDFDisplayView 0x114e309b0 f=(0,0,980,683) b=(-) TIME drawRect: min/mean/max 0.00/0.00/0.00 ms
      [   AF    wlU ] h=--- v=--- NSScroller 0x100766e50 f=(265,0,15,130) b=(-) => <_NSViewBackingLayer: 0x100766e20> TIME drawRect: min/mean/max 0.00/0.00/0.00 ms
  [   AF    wlU ] h=-&- v=-&- NSTextField 0x104c87110 f=(7,27,286,25) b=(-) => <_NSViewBackingLayer: 0x110a5b910> TIME drawRect: min/mean/max 0.00/0.00/0.00 ms
  [   AF    wlU ] h=-&- v=-&- NSTextField 0x110a2ef60 "76 av 152" f=(89,0,115,25) b=(-) => <_NSViewBackingLayer: 0x110a5b970> TIME drawRect: min/mean/max 0.00/0.00/0.00 ms
A=autoresizesSubviews, C=canDrawConcurrently, D=needsDisplay, F=flipped, G=gstate, H=hidden (h=by ancestor), L=needsLayout (l=child needsLayout), U=needsUpdateConstraints (u=child needsUpdateConstraints), O=opaque, P=preservesContentDuringLiveResize, S=scaled/rotated, W=wantsLayer (w=ancestor wantsLayer), #=has surface

我还在 _pdfView 和 self 上使用 setNeedsLayout:YES 和 setNeedsDisplay:YES 进行了测试,没有任何变化。

有什么建议吗?

【问题讨论】:

  • 同样的问题。但是,当我调整窗口大小时,它会自动缩放。

标签: macos cocoa osx-mavericks


【解决方案1】:

试试这个:

self.pdfView.autoScales = NO;
self.pdfView.document = _currentDocument
self.pdfView.autoScales = YES;

它对我有用,所以希望对你有用。

【讨论】:

  • 谢谢!这也对我有用,虽然我不明白为什么。
  • 此解决方法也在 macOS 11.1 Big Sur 中修复它
【解决方案2】:

似乎是一个错误。通过调整超级视图的大小来解决它。然后它会自动调整大小。

//int widthModifierForMavericksWorkaround = 1;

-(void)refresh
{
    // Ugly workaround for Mavericks, resize view so it updates its scale

    CGSize size = self.frame.size;
    size.width += widthModifierForMavericksWorkaround;
    [self resizeSubviewsWithOldSize:size];

    widthModifierForMavericksWorkaround *= -1;
}

【讨论】:

  • 我发现这对我不起作用。此外,文档明确表示不要调用 -resizeWithOldSuperviewSize:.
【解决方案3】:

在加载您的pdf 文档后尝试这样做:

[self.pdfView setDocument:pdfDoc];
[self.pdfView zoomIn:self];
[self.pdfView setAutoScales:YES];

【讨论】:

  • 抱歉不起作用。但是解决了它(非常丑陋),但是改变了超级视图的宽度,所以让它自动缩放。
  • 我发现更改宽度确实会使其自动缩放,但在 Mavericks 上,如果 PDFView 的显示模式设置为连续,则会导致 PDF 显示部分向下滚动。
猜你喜欢
  • 2020-02-11
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多