是的,您需要自己实现它,但它并不太复杂。
首先,您需要对区域视图的行为和外观做出一些决定。您是否只需要调整大小或还能够拖动(移动)视图?当它们被被动/拖动/调整大小/突出显示时,它们是如何绘制的。您想要调整大小并拖动光标吗?调整大小的行为是什么,只是拖动一个角还是所有边框?拖动边框宽度是多少?
然后,您可以对用作区域视图的 NSView 进行子类化。给它一些私有成员来指示它的状态(如 isDragged、isResized 等)。
实施drawRect:
绘制视图。考虑到它的各种状态(例如,您可能希望可视化它何时被拖动或调整大小,绘制透明覆盖层等)。
接下来你要处理鼠标事件 https://developer.apple.com/library/mac/documentation/cocoa/Conceptual/EventOverview/HandlingMouseEvents/HandlingMouseEvents.html#//apple_ref/doc/uid/10000060i-CH6通过实施mouseDown:
, mouseDragged:
, mouseUp:
有可能mouseMoved:
。这里将放置您的调整大小/拖动逻辑。检查用户最初点击的位置mouseDown:
并决定从设置相关状态的那一刻起可以进行哪些操作。跟进于mouseDragged:
执行操作(通过相应地设置视图的框架原点和大小)。完成操作mouseUp:
(验证、设置状态、调用完成逻辑、注册撤消操作)
当处理点和直角时,不要忘记坐标系 https://developer.apple.com/library/mac/documentation/cocoa/Conceptual/CocoaDrawingGuide/Transforms/Transforms.html#//apple_ref/doc/uid/TP40003290-CH204-BCIDJJBI。您将需要将它们转换为视图和基本系统或从视图和基本系统转换它们。 NSView 拥有为此所需的所有方法。
你需要打电话setNeedsDisplay:
or setNeedsDisplayInRect:
每次您希望视图重新绘制自身以反映大小和位置的变化时。
您可能还想使用追踪区域 https://developer.apple.com/library/mac/documentation/cocoa/reference/NSTrackingArea_class/Reference/Reference.html对于视图中需要不同光标的区域(例如,调整角落上的光标大小)。
拖动/调整大小时,不要忘记实现响应用户将鼠标拖出父级视图边界的逻辑。
顺便问一下,为什么要将视图添加到滚动视图中?我认为它们最好放置为图像视图(如果可能)或剪辑视图的子视图,以便它们可以滚动。