如何将子视图添加到 OS X 中的 webView,以便它滚动

How do I add a subView to a webView in OS X so It will scroll

这应该有效,但没有。不过,类似的东西会在 iOS 中起作用。

- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame
{
    NSView<WebDocumentView>* doc = [[[self.webView mainFrame] frameView] documentView];
    TestView* testView = [[TestView alloc]init];
    [testView setFrame:CGRectMake(200, 400, 100, 50)];
    NSScrollView* sv = [doc enclosingScrollView];
    [sv addSubview:testView];
    [self.webView setNeedsDisplay:YES];
}

testView 出现但不会随文档一起滚动。将它添加到发件人会产生相同的结果。将 testView 添加到 doc 不会产生可见效果。

如果没有人知道另一种方法,我应该可以通过实时滚动通知来完成。

谢谢

我已经按照你说的做了。演示应用程序位于:https://dl.dropboxusercontent.com/u/108679476/webDemo.zip

我已经对 webView、doc 和 sv 的 setNeedsDisplay 进行了试验。 AddToScrollView 按钮有效但不会滚动或放大。 在我尝试过的任何情况下,AddToDoc 按钮都不起作用。

是否有可能是 scrollView 忽略了 setNeedsDisplay 因为它不知道 doc 已被更改?

谢谢

它没有移动,因为您正在将它添加到 NSClipView。如评论中所述,应将其添加到 documentView 中。完成后,我遇到了无法看到视图的问题。所以我启动了名为 "Interface Inspector" 的工具并验证了视图。它在那里,正确地移动但没有被绘制。所以我将您的视图更改为图层支持,它开始工作了。

-(IBAction)addToScrollView:(id)sender
{
  NSView<WebDocumentView>* doc = [[[self.webView mainFrame] frameView] documentView];
  TestView* testView = [[TestView alloc]init];
  [testView setFrame:CGRectMake(200, self.currentSVYCoordinate, 100, 50)];
  testView.wantsLayer = YES;
  CALayer *layer = [[CALayer alloc] init];
  layer.backgroundColor = [[NSColor redColor] CGColor];
  testView.layer = layer;
  self.currentSVYCoordinate = self.currentSVYCoordinate + 200;
  NSScrollView* sv = [doc enclosingScrollView];
  NSView *documentView  = [sv documentView];
  [documentView addSubview:testView];
  [sv setNeedsDisplay:YES];
}

这似乎是正确的方法。它滚动并响应 mouseDown,但它不放大:

-(IBAction)addToScrollView:(id)sender
{
NSView<WebDocumentView>* doc = [[[self.webView mainFrame] frameView] documentView];
TestView* testView = [[TestView alloc]init];
[testView setFrame:CGRectMake(200, self.currentSVYCoordinate, 100, 50)];
self.currentSVYCoordinate = self.currentSVYCoordinate + 200;

//Use testview's drawRect to add a color

NSScrollView* sv = [doc enclosingScrollView];
[sv.contentView addSubview:testView];
[self.webView setNeedsDisplay:YES];

}