5

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

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

有一种addAreaToImage方法可以在用户当前正在查看的任何地方的中心添加NSView一个NSScrollView我想要的是让用户能够单击并拖动该区域的角落以将其调整大小/移动到他们想要的任何位置。如果你愿意的话,有点像一个实时边界框。

阅读完文档后,与拖动相关的大部分内容都是关于使 NSView 成为拖动其他东西(如图像)的地方,或者由于超级视图被调整大小而调整大小,这两者都不是我想要做的。

我担心这个问题的答案(或导致我能够推出自己的解决方案的一组答案)是如此基本,以至于没有人考虑过它们,最近几天的谷歌搜索已经证实了这一点为了我。

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

4

1 回答 1

12

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

首先,您需要就您希望区域视图的行为和外观做出一些决定。您是否只需要调整大小或能够拖动(移动)视图?当它们被被动/拖动/调整大小/突出显示时,它们是如何绘制的。你想要调整大小和拖动光标吗?调整大小的行为是什么,只需拖动一个角或所有边框?拖动边框宽度是多少?

然后,您将用作区域视图的 NSView 子类化。给它一些私有成员来指示它的状态(如 isDragged、isResized 等)。

实现drawRect:以绘制视图。考虑到它的各种状态(例如,您可能希望在拖动或调整大小时对其进行可视化,绘制透明叠加层等)。

接下来,您想通过实现,和可能来处理鼠标事件。此处将放置您的调整大小/拖动逻辑。检查用户最初点击的位置,并决定从设置相关状态的那一点开始可以进行哪些操作。跟进执行操作(通过相应地设置视图的框架原点和大小)。在(验证、设置状态、调用完成逻辑、注册撤消操作)中完成操作mouseDown:mouseDragged:mouseUp:mouseMoved:mouseDown:mouseDragged:mouseUp:

在处理点和矩形时,不要忘记坐标系。您需要将它们转换为视图和基本系统/从视图和基本系统转换。NSView 具有为此所需的所有方法。

您需要调用setNeedsDisplay:orsetNeedsDisplayInRect:每次您希望视图重绘自身以反映大小和位置的变化。

您可能还想对视图中需要不同光标的区域使用跟踪区域(例如,在角落调整光标大小)。

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

顺便说一句,为什么要将视图添加到滚动视图中?我认为它们最好作为图像视图(如果可能)或剪辑视图的子视图放置,以便它们可以滚动。

于 2013-10-16T10:47:23.160 回答