2016-12-28 126 views
1

因此,我收到一条通知,提供我需要绘制路径的数据。此代码来自我的主应用程序控制器:为什么我的NSBezierPath没有显示?

-(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]; 
} 

如果我在该类中绘制中风显示,但我怎么能从控制器上绘制该视图?还是应该在视图中收到通知并从该类中抽取通知?

+0

所有绘图必须发生在'-drawRect:'内部。因此,在'-handleAdd:'存储数据并将视图标记为needeing display:'[myView setNeedsDisplay:YES];'。最后,您需要为贝塞尔路径设置颜色。 –

回答

4

您不能(轻松地)从控制器中抽取视图。

将您的看法drawRect想象为每次刷新时绘制内容的完整指示集。

所以,现在你说的是“我充满白色”

您需要处理所有相关图纸的意见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 

如果你想探索你想看看在NSViewlockFocus/unlockFocus方法的第一种技术。该文件解释了为什么你可能不想这样做。

+0

我现在明白了,但是如果每刷新一次,它都会用白色填满,你以前的形状将会消失?而当你运行你的应用程序,myPath将没有任何东西可以绘制,对吧?我应该控制吗? –

+0

还有一件事,如果我没有参考视图中的面板,我该怎么办? –

+0

您需要找到一种方法将相关信息传递给视图,以便它可以绘制它,无论是通过传递对“panelController”的引用还是设置模型并使用它。您目前的图纸只会持续一次,不会添加。如果你有10行绘制,你必须在每个周期绘制它们。 –