【问题标题】:Drag-to-resize NSView (or other object)拖动调整大小 NSView(或其他对象)
【发布时间】:2013-10-14 12:59:40
【问题描述】:

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

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

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

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

我担心这个问题的答案(或能够让我推出自己的解决方案的一组答案)是如此基本,以至于没有人考虑过它们,谷歌搜索的最后几天对我来说已经很确定了。

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

【问题讨论】:

  • 嗨@Carter Fort,你有没有得到这个工作?我想做一些非常相似的事情,如果你能帮助我开始 - 我会非常感激。

标签: objective-c macos cocoa


【解决方案1】:

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

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

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

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

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

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

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

您可能还想将Tracking Areas 用于视图中需要不同光标的区域(例如,调整角落上的光标大小)。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 2011-06-21
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多