我正在寻找一种基本的,简单的示例,说明如何使用自定义NSView在NSScrollView中使用一对NSScroller。
有一些零星的例子,主要包括使用编程创建的接口的人为例子,或基于开发人员使用典型的ImageView或TextView的假设。甚至Sketch示例都基于NSView,它使用“打印”对话框中的页面设置作为边界,而所有内容都由Cocoa管理。因此,没有真正的讨论或示例如何使用自定义模型使其全部工作(尽管这可能是问题的一部分,因为基于模型的是什么?)。即使是Apple自己的文档也很狡猾。
基本上,我在NSScrollView(根据Scoll View Guide)中嵌入了一个子类NSView,用户可以在视图中单击以创建,编辑和删除对象,就像插图程序一样。 Model是那些只是数据包装器的对象,它们只是记录drawRect:的使用位置。高度和宽度基于根据需要转换为像素的自定义值。
我的问题是我发现的所有示例都基于文本编辑器,图像查看器,或者使用“页面设置”对话框中的标准文档大小。因为这些是常见的文档类型,Cocoa基本上是为开发人员管理的,所以交互代码或多或少是隐藏的(或者我只是没有看到它的内容)。我的项目不符合任何需求,我也不需要打印。将我的模型推入documentView属性是行不通的。
我只是在寻找一个简单的例子,说明如何使用自定义的,面向对象的模型(documentView)初始化NSScroller,并根据用户操作处理滚动和更新,例如当用户拖动一小部分时对象向左或向下移动或窗口调整大小。我认为我已经接近完成所有这一切,但我错过了将控制与文档联系起来的跳跃点。
(在Cocoa问题中并不重要,但是当我在REALbasic中执行此操作时,我只需根据用户操作计算并应用MaxX,MaxY到ScrollBar的最大值,在用户时观察ScrollBar中的位置点击,并根据需要绘制。看起来NSScrollView上下文中的NSScrollers对我来说并不那么明显。)
我很欣赏每个人所花的时间,但我正在更新更多信息,希望得到一个我可以使用的答案。对不起,但这一切都没有意义,Apple的文件很简陋,但也许我错过了一些非常明显的东西......
我有一个坐在子类NSDocument中的对象数组,这些数据持有者告诉drawRect绘制什么和在哪里绘制。这是Sketch示例中的直接。 Sketch示例使用“页面设置”对话框中的文档大小来显示大小,因此此处无需显示任何内容。我很酷,Cocoa处理滚动条的状态,但是如何链接ScrollView以查看NSDocument中保存的初始编辑器状态以及对这些对象和编辑器的更新?我是否计算自己的NSRect并将其传递给NSScrollView?在哪里以及如何?我是否在我的自定义NSView中执行此操作,该NSView已嵌入在NSScrollView或我的NSDocument中? NSScrollView不是以编程方式创建的(没有简单的方法),所以它们都在Interface Builder中等待连接。我错过了连接位。
也许我本周穿着“我不明白”的帽子,但这不是那么困难。插图应用程序,MIDI编辑器和无数其他类似的自定义应用程序一直这样做。
已解决(大部分):
我想我现在已经解决了这个问题,尽管它可能不是最好的实现方式。
我的文档类现在有一个NSRect DocumentRect属性,该属性查看其所有对象,并根据它们的位置返回一个新的NSRect。我用
中的子类NSView鼠标事件调用它[self setFrame:[[self EditorDocument] DocumentRect]];
这会根据用户交互更新视图的大小,窗口现在可以处理之前没有的滚动。在这一点上,我正在弄清楚如何在拖动时让框架扩展,但至少我现在有了我缺少的基本概念。
给出的答案指出了我需要去的方向(documentView需要一个视图,转换为查看NSView类),所以Peter获得了荣誉。非常感谢你的帮助。
答案 0 :(得分:4)
文档视图不是模型,而是视图。这就是为什么它被称为文档 view 。
直接使用NSScrollers的例子很少是因为你通常不这样做。您使用NSScrollView并让它为您处理滚动条。
您需要做的就是创建一个足够大的视图来显示整个模型,然后将其设置为滚动视图的文档视图。从那里,它应该只是工作。您不需要自己管理任何与滚动相关的数字; Cocoa为你处理它们。
有关详细信息,请参阅Scroll View Programming Guide。