objective-c - 我的 NSView 子类不会刷新/重绘,但会调用 -drawRect

标签 objective-c cocoa

我有一个简单的测试应用程序,但遇到了问题。 UI 是两个 slider (x 和 y)和一个自定义 View ,我在上面画了一个红点。现在,点将显示在初始位置,但不会随 slider 移动。使用 NSLog 我可以知道,当我移动 slider 时,drawRect 被调用并且 x 和 y 数据是当前的。 我的 NSView 子类:

#import <Cocoa/Cocoa.h>


@interface BallView : NSView {
    NSRect rect;
    NSBezierPath *bp2;
}
@property (readwrite) NSRect rect;
@end

#import "BallView.h"


@implementation BallView
@synthesize rect;
- (id)initWithFrame:(NSRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code here.
    rect = NSMakeRect(50, 10, 10, 10);

    }
    return self;
}


- (void)drawRect:(NSRect)dirtyRect {
    NSLog(@"draw rect: %f, %f", rect.origin.x, rect.origin.y);
    bp2 = [NSBezierPath bezierPath]; 
    [bp2 appendBezierPathWithOvalInRect: rect];
    NSColor *color2 = [NSColor redColor];
    [color2 set];
    [bp2 fill]; 
}

将 slider 值获取到应用程序委托(delegate)矩形中:

-(IBAction) setX:(id)sender{
x=[sender floatValue];
[ballView setRect: NSMakeRect(x, y, 10, 10)];
NSLog(@"set x");
}

-(IBAction) setY:(id)sender{
    y= [sender floatValue];
    [ballView setRect: NSMakeRect(x, y, 10, 10)];
    NSLog(@"set y");
}

最佳答案

您不会告诉 View 它需要重绘。放置

[ballView setNeedsDisplay:YES];

进入状态突变 Action 。我通常会为此目的实现 setter ,并让它们从 View 内部调用它,而不是综合它。

关于objective-c - 我的 NSView 子类不会刷新/重绘,但会调用 -drawRect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8541210/

相关文章:

ios - 自动检测一天中的时间

objective-c - CFNotificationCenter 用法示例?

cocoa - 如何验证通过 Cocoa Bindings 动态填充的菜单项

ios - 两者都实现了类。将使用两者之一

iphone - 在 iPhone Development/Objective-C 中初始化实例变量

c - 往返文本和返回

objective-c - 通过 TableView 在核心数据实体中进行计算

cocoa - 如何从每个架构的预构建 dylib 中创建通用 dy​​lib?

objective-c - iOS 设备上的字体

objective-c - UITextView 中的不同文本格式?或者是其他东西?