objective-c - 自定义形状的 NSTrackingArea

标签 objective-c swift macos cocoa

我想创建一个画图的 Canvas 。

为此,我创建了派生自 NSView 的自定义类,我在其中淹没了两个矩形并用两条线将它们连接起来。

我正在使用 NSView.addTrackingArea 功能来移动和调整矩形的大小。

我面临的问题是,如何创建跟踪区域来跟踪行的鼠标事件? (NSTrackingArea 接受 NSRect 形状。)

第二个问题更多是关于方法。您如何看待这种方法可以处理图形对象?

enter image description here

最佳答案

我认为您在问题中概述的方法不合适。正如您已经看到的,跟踪区域不能代表非矩形形状,如果您正在创建图形应用程序,您将需要代表各种非矩形形状,而不仅仅是线条。幸运的是,Apple 本身以 Sketch 的形式提供帮助,一个示例绘图应用程序,可以回答有关任何想要在屏幕上绘制大量不同形状的程序的基本设置的一些基本问题。

enter image description here

这里简要概述了他们如何将形状放到 Canvas 上以及如何对这些形状进行 HitTest :

  • Canvas 是一个单独的 NSView 和一个包含 Graphic 对象的数组。
  • Graphic 是继承自 NSObject抽象基类。它公开了许多方法:

    Graphic: NSObject
        - isContentUnderPoint(point: CGPoint) -> Bool
        - frame: CGRect
        - drawInRect(rect: CGPoint)
    
  • 有许多具体的 Graphic 子类(LineRectangleCircleSquare等),每个都根据需要实现了上述方法。

  • 将形状显示到屏幕发生在 Canvas 的 drawRect:

    // In MyCanvas (an NSView subclass)
    func drawRect(dirtyRect: CGRect) {
        for shape in self.graphics {
            shape.drawInRect(dirtyRect) 
        }
    }
    
  • HitTest 的原理大致相同...

    // in MyCanvas (an NSView subclass)
    func mouseDown(theEvent: NSEvent {
        let canvasPoint = convertPoint(theEvent.locationInWindow, fromView: nil)
        for shape in self.graphics {
            if shape.isContentUnderPoint(canvasPoint) {
                // do something!
            }
        }
    }
    

Line 形状的情况下,isContentUnderPoint 实现可能会计算线的等式(使用它的起点和终点),然后插入鼠标下点以查看它是否适合等式。总而言之,它只需要几行代码,而且它完全避免了任何 Cocoa 绘图体操。

关于objective-c - 自定义形状的 NSTrackingArea,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38963011/

相关文章:

bash - 为什么 wget 从 PyCharm 的终端运行时以俄语打印所有消息?

objective-c - 如果错误 == nil swift 解析

objective-c - ios - 将数据传递给另一个方法 - 相同的 viewController

swift - 如何从 AVPlayer 中删除实时文本

Swift4:强制转换从 'Data?' 到 'Data' 只解包选项;你是想使用 '!' 吗?

macos - Mac OS High Sierra kext 签名

iphone - 如何设置iPhone中特定部分的编辑是"is"

iphone - Passkit/存折iOS 5

objective-c - Swift 5 中的 NSData.bytes[下标]

Mac OS X 10.8.5 上的 MySQL 连接错误