Objective-C:在OS X中绘制2D图形

3

我不知道如何在Objective-C中控制和操作2D图形。如果答案能说明如何使用Quartz或Cocoa都可以。我现在有这段代码:

CGContextRef myContext = [[NSGraphicsContext currentContext] graphicsPort];
CGContextSetRGBFillColor (myContext, 1, 0, 0, 1);
CGContextFillRect (myContext, CGRectMake (0, 0, 200, 100 ));
CGContextSetRGBFillColor (myContext, 0, 0, 1, .5);
CGContextFillRect (myContext, CGRectMake (0, 0, 100, 200));

我从苹果的Quartz 2D图形教程中获得了这段代码,但当我调用该方法时,没有任何反应。我确定我只是在某个地方漏掉了一些代码。
我正在使用Xcode开发OS X应用程序,其中涉及2D图形,但Mac Developer Library中的教程并不是很详细,除非我读错了所有的教程。我完全不懂Obj-C绘图,所以这可能看起来很基础。
如果需要其他信息,请在评论中询问。谢谢。

你在哪里调用那段代码?你需要一个图形上下文来绘制(即在drawRect:内部调用它)。 - David Rönnqvist
1
我应该在哪里声明这个图形上下文?在Java中,你需要一个JFrame来绘制图形,但是在Obj-C中,我应该在哪里声明要绘制的窗口?我有一个包含此代码的方法,并且该方法会在按下按钮时被调用。 - Arc676
你不需要自己创建它。你可以在 drawRect: 方法中读取当前上下文。当视图需要绘制时,该方法将被调用。如果你需要重新绘制视图,只需在其上调用 setNeedsDisplay 方法,这将标记它为脏视图,以便重新绘制。 - David Rönnqvist
1
我应该在哪个对象上调用 setNeedsDisplay 方法?NSWindow 上吗? - Arc676
3个回答

1
你需要创建一个NSView子类,将你的绘画代码放在drawRect:方法中。在UI中放置一个自定义视图,并在检查器中将其连接到你的子类。
Cocoa绘图API开始学习。它更容易入手,而且你可以做很多事情。
如果你的绘画代码中有一个属性需要改变,你需要在该属性的setter方法中写上[self setNeedsDisplay]。

“自定义视图”是指NSWindow或类似的东西,对吗?我使用Xcode,在接口生成器中制作一个新的NSWindow,并将其链接到类本身?另外,如果我需要不断重新绘制,那么是否意味着我需要将[myView setNeedsDisplay]放在while循环中? - Arc676
你应该多读一些相关的资料,可以从这里开始。 - cueloop
你可以创建一个新的类(NSView的子类)。在ViewController中(其中调用了你的NSWindow),你可以添加对该类的调用: Drawing *draw = [[Drawing alloc] initWithFrame:CGRectMake(20, 20, 100, 100)]; [self.view addSubview:draw]; - Darius Miliauskas

0
你可以创建一个新的类(NSView的子类)- 在我的例子中叫做“Drawing”(“@interface Drawing : NSView”)。在ViewController(你的NSWindow所在的地方)中,你可以调用那个类:
#import "Drawing.h"
<...>
- (void)viewDidLoad {
    [super viewDidLoad];
    Drawing  *draw = [[Drawing  alloc] initWithFrame:CGRectMake(20, 20, 100, 100)];
    [self.view addSubview:draw];
<...>
}

0

你的应用程序应该有一个IUView实例。然后重写drawRect方法。示例如下:

- (void)drawRect:(CGRect)rect
{
    UIBezierPath *aPath = [UIBezierPath bezierPathWithOvalInRect:
                           CGRectMake(0.0f, 0.0f, 150.0f, 100.0f)];
    [[UIColor blackColor] setStroke];
    CGContextRef aRef = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(aRef, 50.0f, 50.0f);
    aPath.lineWidth = 5.0f;
    [aPath stroke];
}

不要直接调用此方法;请使用

[self setNeedsDisplay].

问题是关于 OS X,而不是 iOS。 - Darius Miliauskas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接