NSRects的副本没有显示

时间:2013-08-20 07:58:37

标签: cocoa nsview nsrect

我正在尝试制作一个简单的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基础知识的帮助都会受到赞赏!

1 个答案:

答案 0 :(得分:1)

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

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

drawRect中填充视图的边界 - 这是在视图坐标中。然后你尝试填充“停留”,这些是在超视图坐标中,但将被视为视图坐标,并且无疑是在视图范围之外,因此将被剪切。

请尝试填充窗口的“纸板”视图,并将框视图作为其子视图。电路板视图应保留并绘制“停留”列表,单击时“框”视图应将其当前帧添加到电路板视图列表中。这些停留总是在董事会的范围内。

HTH。