DrawRect Square / Rectangle用户值

时间:2013-12-07 11:57:26

标签: objective-c cocoa drawrect

我有书,我检查了苹果文档,而且没有点击。

这就是我想要做的事情:获取用户值并用它们绘制正方形/矩形。

右侧有一个自定义视图的窗口。

左侧两个文本字段,两个标签(宽度和高度)和一个“绘图”按钮。 在右边的DrawView。

有人可以做到这一点:

您必须为appDelegate中的textFields和按钮建立连接,并为自定义视图提供IBOutlet。

在customView中,您需要有两个变量来保存textField中的值。不要使用property / synthesize,因为一旦你设置了你需要在customView-DrawView中调用setNeedsDisplay的值。

AppDelegate.h

#import <Cocoa/Cocoa.h>
#import "DrawView.h"

@interface AppDelegate : NSObject <NSApplicationDelegate>

@property (assign) IBOutlet NSWindow *window;

@property (weak) IBOutlet DrawView *myDrawView;


@property (weak) IBOutlet NSTextField *widthTextField;
@property (weak) IBOutlet NSTextField *heightTextField;

- (IBAction)draw:(id)sender;

@end

AppDelegate.m

#import "AppDelegate.h"
#import "DrawView.h"

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
}

- (IBAction)draw:(id)sender {

    [_myDrawView setWidth:[_widthTextField floatValue]];
    [_myDrawView setHeight:[_heightTextField floatValue]];
}

DrawView.h

#import <Cocoa/Cocoa.h>

@interface DrawView : NSView {

    float width;
    float height;
}

-(void) setWidth: (float) aWidth;
-(void) setHeight: (float) aHeight;

@end

DrawView.m

#import "DrawView.h"

@implementation DrawView

#pragma mark - Setters

-(void) setWidht:(float)aWidth {

    width = aWidth;
    [self setNeedsDisplay:YES];
}

-(void) setHeight:(float)aHeight {
    height = aHeight;
    [self setNeedsDisplay:YES];
}


#pragma mark - Drawing

- (id)initWithFrame:(NSRect)frame {
    self = [super initWithFrame:frame];

    if (self) {

        [self setWidth:10];
    }
    return self;
}

- (void)drawRect:(NSRect)dirtyRect {

    //BackGround Color
    [[NSColor whiteColor] setFill];
    NSRectFill(dirtyRect);
    [super drawRect:dirtyRect];


    NSBezierPath* square = [NSBezierPath bezierPath];
    [square setLineWidth:2];

    NSRect squareRect = NSMakeRect(10,10,width,height);

    [square appendBezierPathWithRoundedRect:squareRect xRadius:5 yRadius:5];

    [square stroke];
}
@end

就是这样。我不知道是否有更好的方法。这看起来有点奇怪。

1 个答案:

答案 0 :(得分:0)

是的,它是drawRect中的nill但是在它到达drawRect之前它并不是因为我可以用相同的值来计算区域...你能不能试试吧。它只需要5'。