【问题标题】:Preventing user to access a view in a NSView hierarchy防止用户访问 NSView 层次结构中的视图
【发布时间】:2016-01-03 09:40:03
【问题描述】:

也许这是我对NSView层次结构的奇怪理解,但问题是:

我有一个带有 SplitViewController 的窗口,它具有经典的两个子视图。

当用户单击工具栏上的按钮时,我会添加一个“正在进行的工作”视图,如下所示:

    NSView* workingView;

    // creating the view
    ...

    [self.view addSubView:workingView];

其中selfSplitViewController 对象。我的理解(也来自 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


【解决方案1】:

您应该创建一个新的视图控制器来管理您的新视图,然后将其呈现为表单。每个平台的显示风格略有不同,但这是正确的做法。

另一种方法是截取拆分视图并将图像传递给新控制器,该控制器显示为全尺寸。然后它会应用叠加层并在背景图像前面添加自己的内容视图。

【讨论】:

  • 谢谢...但是窗口可以调整大小。当窗口增长时,仿射变换(比例)非常明显:)
  • 那么表单选项是最好的。或者将新视图添加为拆分视图监督的子视图。
  • 我根据您创建新视图控制器的第一个提示编辑了我的问题(我觉得很优雅的解决方案:))
猜你喜欢
  • 2013-06-16
  • 1970-01-01
  • 1970-01-01
  • 2021-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-11
相关资源
最近更新 更多