2016-12-28 128 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行繪製,你必須在每個週期繪製它們。 –