gpt4 book ai didi

objective-c - 如何正确使用自定义 View ?

转载 作者:行者123 更新时间:2023-12-03 17:29:13 27 4
gpt4 key购买 nike

我一直在尝试制作一个简单的绘图程序。最近,我想出为此目的在自定义 View 中绘制形状。我的问题是我必须在一个时间点绘制所有内容。我不知道这是否真的有意义,但在我看来,它只调用 drawRect 方法一次,即在启动时“一次”。

这是迄今为止我的代码:

头文件。

NSBezierPath *thePath;
NSColor *theColor;
NSTimer *updateTimer;
NSPoint *mousePoint;
int x = 0;
int y = 0;

@interface test : NSView {
IBOutlet NSView *myView;

}

@property (readwrite) NSPoint mousePoint;

@end

然后,在.m文件中实现。

@implementation test

@synthesize mousePoint;

- (void) mouseDown:(NSEvent*)someEvent {
CGEventRef ourEvent = CGEventCreate(NULL);
mousePoint = CGEventGetLocation(ourEvent);
NSLog(@"Location: x= %f, y = %f", (float)mousePoint.x, (float)mousePoint.y);
thePath = [NSBezierPath bezierPathWithRect:NSMakeRect(mousePoint.x, mousePoint.y, 10, 10)];
theColor = [NSColor blackColor];

}

- (void) mouseDragged:(NSEvent *)someEvent {
mousePoint = [someEvent locationInWindow];
NSLog(@"Location: x= %f, y = %f", (float)mousePoint.x, (float)mousePoint.y);
x = mousePoint.x;
y = mousePoint.y;
[myView setNeedsDisplay:YES];

}

- (void) drawRect:(NSRect)rect; {
NSLog(@"oisudfghio");
thePath = [NSBezierPath bezierPathWithRect:NSMakeRect(x, y, 10, 10)];
theColor = [NSColor blackColor];
[theColor set];
[thePath fill];

}

@结束

启动时,它会在左下角绘制一个矩形,就像它应该的那样。问题是,drawRect 方法仅在启动时调用。无论我做什么它都不会触发。

编辑:我刚刚更新了代码。我希望它有帮助。

第二次编辑:我确实简化了代码。我希望这能有所帮助。

最佳答案

简短回答:当 View 的状态发生更改以使其绘制方式不同时,您需要调用 -[NSView setNeedsDisplay:]。这将导致您的 View 的drawRect:方法在不久的将来被调用。你永远不应该自己调用drawRect:。这是代表您调用的回调。

当应用程序中发生导致您想要更改绘图的事件时,捕获有关实例变量中发生的情况的状态,调用 setNeedsDisplay: ,然后在调用 drawRect: 时执行新绘图。

长答案:在 Cocoa 中,窗口绘制是通过拉取/失效模型完成的。这意味着窗口知道它是否需要绘制,并且当它认为需要绘制时,它会在每个事件循环中绘制一次。

如果您不熟悉事件循环,您可以在Wikipedia上阅读有关它们的内容。

在应用程序的顶层,您可以想象 Cocoa 正在这样做:

while (1) {
NSArray *events = [self waitForEvents];
[self doEvents:events];
}

事件是指鼠标移动、键盘按下和计时器关闭等事件。

NSView 有一个方法 -[NSView setNeedsDisplay:]。它需要一个 bool 参数。当调用该方法时,窗口会使该 View 的绘图区域无效,并为将来安排一个事件来进行重绘 - 但前提是没有安排预先存在的重绘事件。

当runloop下次旋转时,用setNeedsDisplay:标记的 View 将被重新绘制。这意味着您可以连续多次调用 setNeedsDisplay: ,并且以后的绘制将被批量化到一次 drawRect: 调用中。出于性能原因,这很重要,并且意味着您可以在一种方法中多次更改 View 的框架,但它只会在最终位置绘制一次。

关于objective-c - 如何正确使用自定义 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5642448/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com