Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.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
Objective c 拖动以调整NSView(或其他对象)的大小_Objective C_Macos_Cocoa - Fatal编程技术网

Objective c 拖动以调整NSView(或其他对象)的大小

Objective c 拖动以调整NSView(或其他对象)的大小,objective-c,macos,cocoa,Objective C,Macos,Cocoa,我正在尝试构建一个应用程序,允许用户使用可以调整大小的矩形边界框指定图像的多个区域 到目前为止,我已经有了一个NSScrollView,其中包含一个NSImageView,因此用户可以放大图像并根据需要滚动。我目前的想法是,我可以使用NSView作为一种方式来提供一个边界框,用户可以定位并调整其大小以覆盖所需的区域,将NSView帧转换为图像大小的百分比,然后存储这些值供以后使用 有一个addAreaToImage方法,可以将NSView添加到NSScrollView中,该视图位于用户当前查看的

我正在尝试构建一个应用程序,允许用户使用可以调整大小的矩形边界框指定图像的多个区域

到目前为止,我已经有了一个
NSScrollView
,其中包含一个
NSImageView
,因此用户可以放大图像并根据需要滚动。我目前的想法是,我可以使用
NSView
作为一种方式来提供一个边界框,用户可以定位并调整其大小以覆盖所需的区域,将
NSView
帧转换为图像大小的百分比,然后存储这些值供以后使用

有一个
addAreaToImage
方法,可以将
NSView
添加到
NSScrollView
中,该视图位于用户当前查看的位置的中心我想要的是,用户可以单击并拖动区域的各个角落,将其调整/移动到他们想要的任何位置。如果愿意,可以将其排序为活动边界框

在阅读了文档之后,与拖动相关的大部分内容都是关于使NSView成为拖动其他对象(如图像)的地方,或者由于superview的大小调整而调整大小,这两者都不是我想要做的

我担心的是,这个问题的答案(或一套让我能够推出自己的解决方案的答案)是如此基本,以至于没有人想到它们,在谷歌搜索的最后几天里,我几乎已经证实了这一点


我来自iOS开发,所以这不是一个全新的领域,但到目前为止,NSView和UIView似乎有足够多的差异让我完全困惑。

是的,您需要自己实现它,但它并不太复杂

首先,您需要决定区域视图的行为和外观。您需要调整视图的大小还是能够拖动(移动)视图?被动/拖动/调整大小/高亮显示时如何绘制它们。是否要使用调整大小和拖动光标?什么是调整大小的行为,只是拖动一个角或所有的边界?拖动边框的宽度是多少

然后对用作区域视图的NSView进行子类化。给它一些私人成员来表示它的状态(如isDraged、isResized等)

实现
drawRect:
以绘制视图。考虑到它的各种状态(例如,当它被拖动或调整大小时,您可能希望可视化,绘制一个透明的覆盖图,等等)

接下来,您要通过实现
mouseDown:
mouseDragged:
mouseUp:
mouseMoved:
来处理。此处将放置调整大小/拖动逻辑。检查用户最初在
mouseDown:
中单击的位置,并确定从该点设置相关状态可以执行哪些操作。在
mouseDragged:
中执行后续操作(通过相应地设置视图的帧原点和大小)。在
mouseUp:
中完成操作(验证、设置状态、调用完成逻辑、注册撤消操作)

在处理点和矩形时,不要忘记。您需要将它们转换为视图和基础系统,或从中转换。NSView具有实现此目的所需的所有方法

每次希望视图重新绘制自身以反映大小和位置的更改时,都需要调用
setNeedsDisplay:
setNeedsDisplayInRect:

您可能还希望将其用于视图中需要不同光标的区域(例如,调整拐角处光标的大小)

当拖动/调整大小时,不要忘记实现响应用户将鼠标拖出父视图边界的逻辑


顺便问一下,为什么要将视图添加到scrollview?我认为它们最好放在imageview(如果可能)或clipview的子视图中,以便可以滚动。

Hi@Carter Fort,你有没有这样做过?我想做一些非常类似的事情,如果你能帮助我开始,我将不胜感激。