为什么我的NSBezierPath没有显示?

时间:2016-12-28 14:04:51

标签: objective-c xcode cocoa interface-builder

所以我接收了一个通知,其中包含我需要绘制路径的数据。此代码来自我的主app控制器:

<td ng-repeat="d in data.sunday track by $index">{{ d.startTime }}</td>

NSLog正在向我显示正确的数据。我创建了一个视图,并且白色矩形是我想要绘制的地方。

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

如果我在该类中绘制笔画显示,但我怎么能从控制器上绘制该视图?或者我应该只是在视图中收到通知并从该类中提取?

1 个答案:

答案 0 :(得分: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方法。该文档解释了为什么您可能不想这样做。