如何将子视图添加到 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];
}
这应该有效,但没有。不过,类似的东西会在 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];
}