Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa:是否存在具有用户调整大小功能的NSView?_Cocoa_Resize_Drag_Nsview_Nswindow - Fatal编程技术网

Cocoa:是否存在具有用户调整大小功能的NSView?

Cocoa:是否存在具有用户调整大小功能的NSView?,cocoa,resize,drag,nsview,nswindow,Cocoa,Resize,Drag,Nsview,Nswindow,我想要一个NSView,它可以通过拖动右下角来调整大小,就像NSView窗口一样。我希望能够将此NSView嵌入父NSView。Cocoa或其任何扩展中是否有类似的组件?如果您的问题更具体,我可以更具体地回答您的问题。:-) 据我所知,没有类似的东西可用,但创建起来并不十分困难。要做的决定是“谁负责绘制调整大小夹点和调整大小/拖动逻辑?” 视图处理自己的视图 如果用户可调整大小的视图处理绘制夹点和响应调整大小/拖动操作本身,则必须选择是要在视图内容上方绘制夹点还是“围绕外部”。如果要在“外部”绘

我想要一个NSView,它可以通过拖动右下角来调整大小,就像NSView窗口一样。我希望能够将此NSView嵌入父NSView。Cocoa或其任何扩展中是否有类似的组件?

如果您的问题更具体,我可以更具体地回答您的问题。:-)

据我所知,没有类似的东西可用,但创建起来并不十分困难。要做的决定是“谁负责绘制调整大小夹点和调整大小/拖动逻辑?”

视图处理自己的视图

如果用户可调整大小的视图处理绘制夹点和响应调整大小/拖动操作本身,则必须选择是要在视图内容上方绘制夹点还是“围绕外部”。如果要在“外部”绘制夹点,则选择“可用区域”减少,因为您的内容必须插入足够多的空间,以便您绘制调整大小控件,这可能会使绘制和调整大小度量复杂化。如果在内容的“顶部”绘制夹点,可以避免此问题

容器视图处理所有子视图

另一种方法是创建“可调整大小的视图容器视图”,该视图围绕任何子视图的周长绘制调整大小夹点,并在其(容器)的某个夹点区域上接收到拖动事件时,通过“左右调整子视图”来处理拖动/调整大小逻辑。将逻辑放在此处允许任何类型的子视图都可以拖动/调整大小,并为您带来额外的好处,即只有一个稍重的权重视图实例(而许多子视图实例中包含更复杂的逻辑)

基本机制

一旦确定了这一点,实际上只需创建子视图,该子视图进行绘图、管理NSTrackingArea实例(用于夹点区域)并响应适当的鼠标方法(向下、移动等)。在每个子视图处理自己的情况下,它们将管理自己的跟踪区域、夹点绘图和鼠标移动,并设置自己的帧作为响应。在容器视图为其子视图处理所有这些的情况下,它将管理所有子视图的跟踪区域,并在自身上绘制它们的夹点,并设置目标子视图的框架(而子视图完全不知道这一切)

我希望这至少能帮助你大致了解可能的机制。如果我不是刚刚起床,开始喝早茶,我可能会写得更简洁,但你已经做到了。:-)


7年后编辑

因为没有太多关于OP想要什么的细节,我给出了一个非常笼统的答案,但我应该指出几点:

  • 如果可以使用
    NSSplitView
    (即,如果视图彼此对齐并划分公共容器视图的空间),则始终首选该视图。分割视图允许您自定义夹点区域等,并免费对子视图执行所有这些操作
  • 当我写下这个答案时,AutoLayout并不存在,它使您为视图处理多个较大的子视图场景滚动自己的解决方案变得非常复杂
  • 如果您确实需要一个可以在某个容器中拖动/调整大小的UI元素,请尽量避免在主视图中使用CALayers,该主视图可以处理所有布局/调整大小逻辑(如果可以)
  • 如果无法执行上述操作(即,可调整大小的视图包含复杂的控件和布局,有自己的
    NSViewController
    ,等等),请尝试混合方法(使用图层显示未选定视图的缓存图像,仅为选定项添加完整的交互式大小子视图(或项目的子视图)
  • 由于自动布局的复杂性,我真的不能推荐真正的可拖动子视图方法,除非它是不可避免的。如果您设计的视图包含可移动的、可缩放的内容,那么它是最好的(也是最有效的)让它里面的一切都成为视图的责任。例如:一个有很多形状的图形应用程序应该有一个画布视图,使用
    CALayers
    来表示形状(以及任何GUI装饰,如大小/拖动夹点等)。这充分利用了图形加速的优势,并且比一堆图形应用程序效率更高(资源量非常大)
    NSView
    子视图。所有移动/大小/选择逻辑都由“画布视图”处理,唯一的子视图可能是重叠控件(不过,如果画布本身需要包含在滚动视图中,最好使用
    NSScrollView
    机制来允许固定重叠视图用于此目的)
  • 如果设计的视图绘制了很多东西(您应该使用图层来表示这些东西),但只允许选择一个东西,那么即使使用AutoLayout,添加子视图的方法也是可以管理的。如果“selected for editing”有很多复杂的控件,在编辑时可以看到,则带有视图控制器的“编辑器子视图”是有意义的,并且在可维护性(因为视图控制器划分了所有编辑功能/UI处理)和容器视图复杂性方面是一个很好的折衷方案(因为一个子视图不会破坏资源库,在容器视图调整大小和编辑器交互期间维护临时自动布局约束以保持其位置也不会过于复杂)
  • 所有这些都是以macOS为前提的;如果是为iOS设计,肯定会向后弯曲以使用层和新的(截至本文撰写之时)拖放机制,而我目前对它们知之甚少

总之,答案是不完整的,而且有些过时,因此我觉得我最初的建议没有现在那么好。

您可以使用windows,而不是使用视图,并将窗口的样式掩码设置为NSResizableWindowMask

另一种选择是使用