objective-c - 为什么我的 NSBezierPath 没有显示?

标签 objective-c xcode cocoa interface-builder

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

-(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 向我显示了正确的数据。我创建了一个 View ,在那个白色矩形中就是我想要绘制的地方。

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

如果我在该类中绘制,则会显示笔画,但我如何从 Controller 中绘制该 View ?或者我应该在 View 中接收通知并从该类中绘制?

最佳答案

您无法(轻松)从 Controller 绘制到 View 中。

将 View drawRect 方法视为每次刷新时绘制内容的完整指令集。

所以现在你所说的只是“用白色填充我”

您需要在 View drawRect: 方法中处理所有相关绘图。

将您的 Controller 方法调整为此。

-(void) handleAdd:(NSNotification *)aNotification{
    [myViewInstance setNeedsDisplay:YES]; //also myViewInstance.needsDisplay = YES
}

假设 View 引用了面板 Controller ......

@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 方法。该文档解释了为什么您可能不想这样做。

关于objective-c - 为什么我的 NSBezierPath 没有显示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41363703/

相关文章:

cocoa - 以编程方式创建的窗口居中

cocoa - 向表中插入一行时如何获取rowid

c++ - 如何尽早离开 OBJ-C 的世界并在 iOS OpenGL ES 应用程序中进入现有的 C++ 代码库?

c++ - Xcode 未运行最新版本的 OpenGL,这会导致编译错误

c++ - 你能在 Cocoa (Obj-C) 项目中使用 C++ 库吗?

c++ - 使用 OpenCV (C++) 在 Xcode 中访问网络摄像头

iphone - Flurry Analytics,基本分析问题

objective-c - 使 Objective C 程序响应 applescript

ios - Objective-C 如何使用 header 中的嵌套字典将数据发送到 Http Post 请求

ios - 错误 : "No visible @interface for ' UIAlertView' declares the selector 'initWithTitle'