为什么我的 NSBezierPath 没有显示?
Why my NSBezierPath is not showing?
所以我收到了一条通知,其中包含绘制路径所需的数据。此代码来自我的主应用程序控制器:
-(void) handleAdd:(NSNotification *)aNotification{
NSLog(@"x1:%f y1:%f x2:%f y2:%f ",[panelController x1],[panelController y1],[panelController x2],[panelController y2]);
myPath = [[NSBezierPath alloc]init];
[myPath setLineWidth:[panelController grosor]];
[myPath moveToPoint:NSMakePoint([panelController x1],[panelController y1])];
[myPath lineToPoint:NSMakePoint([panelController x2],[panelController y2])];
[[panelController trazado] setStroke];
[myPath stroke];
}
NSLog 向我展示了正确的数据。我创建了一个视图,我想在那个白色矩形中绘制。
- (id)initWithFrame:(NSRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code here.
}
return self;
}
- (void)drawRect:(NSRect)dirtyRect
{
NSRect bounds= [self bounds];
[[NSColor whiteColor] set];
[NSBezierPath fillRect:bounds];
}
如果我在那个 class 中绘制,笔画会显示,但我如何从控制器绘制该视图?或者我应该只在视图中接收通知并从中提取 class?
您不能(轻易地)从控制器绘制到视图中。
将您的视图 drawRect
方法视为每次刷新时绘制内容的完整说明集。
所以现在你说的是 "fill me with white"
您需要在视图 drawRect:
方法中处理 所有 相关绘图。
为此调整您的控制器方法。
-(void) handleAdd:(NSNotification *)aNotification{
[myViewInstance setNeedsDisplay:YES]; //also myViewInstance.needsDisplay = YES
}
假设视图引用了面板控制器……
@interface MyView: UIView
//weak as you don't want a reference cycle
@property (weak) MyPanelController *panelController;
@end
@implementation MyView
- (void)drawRect:(NSRect)dirtyRect
{
NSRect bounds= [self bounds];
[[NSColor whiteColor] set];
[NSBezierPath fillRect:bounds];
NSBezierPath *myPath = [[NSBezierPath alloc]init];
[myPath setLineWidth:[self.panelController grosor]];
[myPath moveToPoint:NSMakePoint([self.panelController x1],[self.panelController y1])];
[myPath lineToPoint:NSMakePoint([self.panelController x2],[self.panelController y2])];
[[self.panelController trazado] setStroke];
[myPath stroke];
}
@end
如果您想探索第一种技术,您需要查看 NSView
和 lockFocus/unlockFocus
方法。文档解释了您可能不想这样做的原因。
所以我收到了一条通知,其中包含绘制路径所需的数据。此代码来自我的主应用程序控制器:
-(void) handleAdd:(NSNotification *)aNotification{
NSLog(@"x1:%f y1:%f x2:%f y2:%f ",[panelController x1],[panelController y1],[panelController x2],[panelController y2]);
myPath = [[NSBezierPath alloc]init];
[myPath setLineWidth:[panelController grosor]];
[myPath moveToPoint:NSMakePoint([panelController x1],[panelController y1])];
[myPath lineToPoint:NSMakePoint([panelController x2],[panelController y2])];
[[panelController trazado] setStroke];
[myPath stroke];
}
NSLog 向我展示了正确的数据。我创建了一个视图,我想在那个白色矩形中绘制。
- (id)initWithFrame:(NSRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code here.
}
return self;
}
- (void)drawRect:(NSRect)dirtyRect
{
NSRect bounds= [self bounds];
[[NSColor whiteColor] set];
[NSBezierPath fillRect:bounds];
}
如果我在那个 class 中绘制,笔画会显示,但我如何从控制器绘制该视图?或者我应该只在视图中接收通知并从中提取 class?
您不能(轻易地)从控制器绘制到视图中。
将您的视图 drawRect
方法视为每次刷新时绘制内容的完整说明集。
所以现在你说的是 "fill me with white"
您需要在视图 drawRect:
方法中处理 所有 相关绘图。
为此调整您的控制器方法。
-(void) handleAdd:(NSNotification *)aNotification{
[myViewInstance setNeedsDisplay:YES]; //also myViewInstance.needsDisplay = YES
}
假设视图引用了面板控制器……
@interface MyView: UIView
//weak as you don't want a reference cycle
@property (weak) MyPanelController *panelController;
@end
@implementation MyView
- (void)drawRect:(NSRect)dirtyRect
{
NSRect bounds= [self bounds];
[[NSColor whiteColor] set];
[NSBezierPath fillRect:bounds];
NSBezierPath *myPath = [[NSBezierPath alloc]init];
[myPath setLineWidth:[self.panelController grosor]];
[myPath moveToPoint:NSMakePoint([self.panelController x1],[self.panelController y1])];
[myPath lineToPoint:NSMakePoint([self.panelController x2],[self.panelController y2])];
[[self.panelController trazado] setStroke];
[myPath stroke];
}
@end
如果您想探索第一种技术,您需要查看 NSView
和 lockFocus/unlockFocus
方法。文档解释了您可能不想这样做的原因。