我正在尝试制作一个简单的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基础知识的帮助都会受到赞赏!
答案 0 :(得分:1)
从你的代码我猜你的问题是有界限的。
看起来你有NSView
你正在屏幕上移动 - 所以它的框架是它在超级视图中的位置,这就是你在makeStay
中保存的内容。
在drawRect
中填充视图的边界 - 这是在视图坐标中。然后你尝试填充“停留”,这些是在超视图坐标中,但将被视为视图坐标,并且无疑是在视图范围之外,因此将被剪切。
请尝试填充窗口的“纸板”视图,并将框视图作为其子视图。电路板视图应保留并绘制“停留”列表,单击时“框”视图应将其当前帧添加到电路板视图列表中。这些停留总是在董事会的范围内。
HTH。