【发布时间】:2016-01-03 09:40:03
【问题描述】:
也许这是我对NSView层次结构的奇怪理解,但问题是:
我有一个带有 SplitViewController 的窗口,它具有经典的两个子视图。
当用户单击工具栏上的按钮时,我会添加一个“正在进行的工作”视图,如下所示:
NSView* workingView;
// creating the view
...
[self.view addSubView:workingView];
其中self 是SplitViewController 对象。我的理解(也来自 iOS 编程)是拆分视图控制器具有三个视图:左视图和右视图以及它们上的 workingView(?)
问题在于,即使workingView 覆盖了整个窗口,这两个视图仍然可以访问。在 iOS 开发中,我们可以将 userInteraction 设置为 NO,因此只有所需的视图处于活动状态。 OSX 呢?
我可以禁用与拆分视图控制器视图的交互并只让workingView 处于活动状态吗?
谢谢
编辑:
我按照@Wain 的提示创建了一个新的 ViewController,其中包含我正在进行的工作视图。
我使用presentViewController:animator 技术展示了它。通过这种方式,我可以更好地控制视图的定位。
在自定义动画器中,我只是简单地为视图着色以查看发生了什么。实际上,动画师添加新视图控制器的方式似乎与将经典视图添加到拆分视图中几乎相同(就像以前一样)。实际上结果是一样的:即使我的工作视图覆盖了属于拆分视图左侧的两个按钮,它们也是可点击的!
-(void)animatePresentationOfViewController:(NSViewController *)viewController fromViewController:(NSViewController *)fromViewController {
NSViewController* bottomVC = fromViewController;
NSViewController* topVC = viewController;
topVC.view.wantsLayer = YES;
topVC.view.layerContentsRedrawPolicy = NSViewLayerContentsRedrawOnSetNeedsDisplay;
topVC.view.alphaValue = 0.0f;
[bottomVC.view addSubview:topVC.view];
topVC.view.layer.backgroundColor = [[NSColor blueColor] CGColor];
topVC.view.frame = CGRectMake(10, 10, 100, 100);
[NSAnimationContext runAnimationGroup:^(NSAnimationContext* context){
context.duration = 1.0f;
topVC.view.animator.alphaValue = 1.0f;
} completionHandler:nil];
}
我知道有什么遗漏或错误...你能帮我理解这里发生了什么吗?
【问题讨论】:
-
您应该真正使用您提供的新视图控制器(在两个平台上)...
-
是的...我在想,但我希望 SplitView 内容在后台保持可见。 workingWindow 显示一个半透明的背景(和窗口一样大)和一个小的居中视图。所以你总能看到背景……我知道这只是一种“视觉”的需要!
-
与其在拆分视图控制器中执行此操作,您不能在包含拆分视图的窗口中执行此操作吗?那么这只是将“进行中的工作”视图保持在拆分视图前面的问题。这可以在窗口控制器中完成。
-
在窗口控制器的 windowDidLoad 方法中,我添加了一个简单的视图,覆盖了一些拆分视图的按钮......不幸的是,如果你点击它们,它们就会响应!
-
我认为你从来没有提到过这个要求。
标签: objective-c macos cocoa nsview