gpt4 book ai didi

objective-c - 用负值更新 NSRect 大小

转载 作者:行者123 更新时间:2023-12-03 17:57:46 27 4
gpt4 key购买 nike

关于 NSRect 的问题...在 Hillegass 书中,我们正在创建一个 NSRect,并在其中绘制一个椭圆形 (NSBezierPath *)。根据我们在 View 中按下鼠标并随后拖动的位置,NSRect 的 size.width 和/或 size.height 可能为负(即,如果我们从右上角开始,拖动左下角 - 两者都是负数)。当实际绘制时,系统是否使用我们的负宽度和/或高度来仅仅定位我们拖动的位置的 NSPoint?从而更新 NSRect?如果我们需要 NSRect 的大小,我们应该只使用绝对值吗?

在本章中,作者使用 MIN() 和 MAX() 宏来创建 NSRect。然而,在挑战解决方案中,他们提供了这三种方法来响应鼠标事件:

- (void)mouseDown:(NSEvent *)theEvent
{
NSPoint pointInView = [self convertPoint:[theEvent locationInWindow] fromView:nil];
// Why do we offset by 0.5? Because lines drawn exactly on the .0 will end up spread over two pixels.
workingOval = NSMakeRect(pointInView.x + 0.5, pointInView.y + 0.5, 0, 0);
[self setNeedsDisplay:YES];
}

- (void)mouseDragged:(NSEvent *)theEvent
{
NSPoint pointInView = [self convertPoint:[theEvent locationInWindow] fromView:nil];
workingOval.size.width = pointInView.x - (workingOval.origin.x - 0.5);
workingOval.size.height = pointInView.y - (workingOval.origin.y - 0.5);
[self setNeedsDisplay:YES];
}

- (void)mouseUp:(NSEvent *)theEvent
{
[[self document] addOvalWithRect:workingOval];
workingOval = NSZeroRect; // zero rect indicates we are not presently drawing
[self setNeedsDisplay:YES];
}

无论潜在的负值如何,此代码都会生成一个成功的矩形。我知道负值仅仅反射(reflect)了相对于原点(我们“鼠标按下”的点)的左移。正确计算我们拖动到的 NSPoint 的幕后发生了什么?

最佳答案

NSRect 只是定义为 NSPoint 和 NSSize。 NSSize 只是定义为一对 CGFloats,但文档说:

Normally, the values of width and height are non-negative. The functions that create an NSSize structure do not prevent you from setting a negative value for these attributes. If the value of width or height is negative, however, the behavior of some methods may be undefined.

在上面显示的代码中,幕后绝对没有发生任何奇特的事情。您正在创建一个恰好具有负大小或宽度的矩形(workingOval),并且您实际上并没有在任何地方使用它。

根据您在其他地方使用workingOval 所做的事情,幕后发生的事情会有所不同。但这将是三件非常简单的事情之一。某些方法将 (origin=(30, 40), size=(-10, -20)) 等矩形视为与 (origin=(20, 20), size=(10, 20)) 相同;其他人将其视为无效矩形;有些人假设他们不进行测试,只会给你垃圾结果。例如,NSMinX 将返回 30,而不是 10。

关于objective-c - 用负值更新 NSRect 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10760583/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com