【问题标题】:Why my NSBezierPath is not showing?为什么我的 NSBezierPath 没有显示?
【发布时间】:2017-05-12 20:01:33
【问题描述】:

所以我收到了一条通知,其中包含我绘制路径所需的数据。此代码来自我的主应用控制器:

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

如果我在那个类中画笔画,那么我怎么能从控制器的那个视图上画呢?还是我应该只在视图中接收通知并从该类中绘制?

【问题讨论】:

  • 所有绘图都必须发生在-drawRect: 内。所以在-handleAdd: 上存储您的数据并将视图标记为需要显示:[myView setNeedsDisplay:YES];。最后,您需要为贝塞尔路径设置颜色。

标签: objective-c xcode cocoa interface-builder


【解决方案1】:

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

将您的视图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 方法。该文档解释了您可能不想这样做的原因。

【讨论】:

  • 我现在明白了,但如果每次刷新都会用白色填充矩形,那么你之前的形状会消失吗?当你运行你的应用程序时,myPath 不会有任何东西要绘制,对吧?我应该控制它吗?
  • 还有一件事,如果我在视图中没有对面板的引用,我该怎么办?
  • 您需要找到一种方法将相关信息传递给视图,以便它可以绘制它,无论是通过传递对您的panelController 的引用还是设置模型并使用它。您当前的绘图将仅持续一次,它不是附加的。如果你有 10 条线要画,你必须在每个循环中都画出来。
猜你喜欢
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-05
相关资源
最近更新 更多