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

Car*_*ort 2 macos cocoa objective-c

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

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

有一种addAreaToImage方法可以添加NSViewNSScrollView用户当前所在位置的中心位置.我想要的是让用户能够点击并拖动该区域的角落,以便在任何他们想要的地方调整大小/移动它.如果愿意,可以选择一个实时边界框.

阅读完文档之后,与拖动相关的大部分内容都是让NSView成为拖动其他内容(如图像)或调整大小的地方,因为调整了superview,这些都不是我想要做的.

我担心的是,这个问题的答案(或一组能够让我能够推出自己的解决方案的答案)是如此基本,以至于没有人想到它们,谷歌的最后几天几乎已经确认了为了我.

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

dan*_*elv 8

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

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

然后,将您正在使用的NSView子类化为区域视图.给它一些私人成员来表明它的状态(比如isDragged,isResized等).

实现drawRect:绘制视图.考虑到它的各种状态(例如,您可能想要在拖动或调整大小时进行可视化,绘制透明覆盖图等).

接下来要处理的鼠标事件通过实施mouseDown:,mouseDragged:,mouseUp:也许mouseMoved:.这里将放置调整大小/拖动逻辑.检查用户最初点击的位置,mouseDown:并确定从该点设置相关状态的可能操作.跟进mouseDragged:以执行操作(通过相应地设置视图的框架原点和大小).完成操作mouseUp:(验证,设置状态,调用完成逻辑,注册撤消操作)

处理点和反应时,不要忘记坐标系.您需要将它们转换为视图和基本系统.NSView具有此所需的所有方法.

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

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

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

那么,为什么要将您的视图添加到scrollview?我认为它们更适合作为imageview(如果可能)或clipview的子视图,因此可以滚动它们.