0

我正在尝试制作一个简单的 Cocoa 程序。我有一个小黑盒子(NSView 的一个子类在屏幕上绘制一个 NSRect)跟随我的鼠标。我正在工作的那部分。我需要做的是:当我单击鼠标时,我想留下那个黑盒子的“副本”。

我一直试图让它工作五个多小时,并且我已经尝试了所有在阳光下的东西。我确信解决方案很简单,我的猜测是我缺少对基本概念的掌握。

这是我所拥有的(“留下”应该是留下的副本):

@property NSMutableArray *stays;

...

- (void) makeStay {
    if (!_stays)
        _stays = [[NSMutableArray alloc]init];

    NSValue *newStay = [NSValue valueWithRect:self.frame];
    [_stays addObject:newStay];
}

...


-(void)drawRect:(NSRect)rect {
    [[NSColor blackColor] set];
    NSRectFill([self bounds]);

    for (int x = 0; x < _stays.count; x++) {
        NSRectFill([_stays[x] rectValue]);
    }
}

任何有关如何理解 NSView 的基本原理的帮助,以便这将不胜感激!

4

1 回答 1

1

从你的代码我猜你的问题是有界的。

看起来你有一个NSView你正在屏幕上移动的东西 - 所以它的框架是它在它的超级视图中的位置,这就是你要保存的内容makeStay

在您drawRect的视图中填充视图的边界 - 这是在视图坐标中。然后,您尝试填充“停留”,它们位于超级视图坐标中,但将被视为视图坐标,并且无疑位于视图边界之外,因此将被剪裁。

尝试让“板”视图填充您的窗口,并将您的框视图作为它的子视图。板视图应保留并绘制“停留”列表,单击“框”视图应将其当前帧添加到板视图列表中。这些停留将永远在董事会的范围内。

HTH。

于 2013-08-20T22:05:59.017 回答