我想创建一个画图的 Canvas 。
为此,我创建了派生自 NSView
的自定义类,我在其中淹没了两个矩形并用两条线将它们连接起来。
我正在使用 NSView.addTrackingArea
功能来移动和调整矩形的大小。
我面临的问题是,如何创建跟踪区域来跟踪行的鼠标事件? (NSTrackingArea
接受 NSRect
形状。)
第二个问题更多是关于方法。您如何看待这种方法可以处理图形对象?
最佳答案
我认为您在问题中概述的方法不合适。正如您已经看到的,跟踪区域不能代表非矩形形状,如果您正在创建图形应用程序,您将需要代表各种非矩形形状,而不仅仅是线条。幸运的是,Apple 本身以 Sketch 的形式提供帮助,一个示例绘图应用程序,可以回答有关任何想要在屏幕上绘制大量不同形状的程序的基本设置的一些基本问题。
这里简要概述了他们如何将形状放到 Canvas 上以及如何对这些形状进行 HitTest :
- Canvas 是一个单独的
NSView
和一个包含Graphic
对象的数组。 Graphic
是继承自NSObject
的抽象基类。它公开了许多空方法:Graphic: NSObject - isContentUnderPoint(point: CGPoint) -> Bool - frame: CGRect - drawInRect(rect: CGPoint)
有许多具体的
Graphic
子类(Line
、Rectangle
、Circle
、Square
等),每个都根据需要实现了上述方法。将形状显示到屏幕发生在 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/