2011-12-16 3 views
0

У меня есть простое тестовое приложение, с которым у меня возникают проблемы. UI - это два ползунка (x & y) и пользовательский вид, на который я рисую красную точку. Прямо сейчас точка будет отображаться в исходном положении, но не будет перемещаться с ползунками. Используя NSLog, я могу сказать, что когда я перемещаю ползунки, которые drawRect получает вызов, а данные x и y являются текущими. Мой подкласс NSView:Мой подкласс NSView не будет обновляться/перерисовываться, но -drawRect называется

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

Чтобы получить значения ползунок, чтобы в приложение делегата прямоугольнику:

-(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"); 
} 

ответ

1

Вы не говорите мнение, что он нуждается в перерисовке. Положить

[ballView setNeedsDisplay:YES]; 

в действие, изменяющее состояние. Я бы обычно реализовал сеттеры для этой цели и заставил их называть это изнутри представления, вместо того, чтобы синтезировать его.

+0

Это было! Спасибо вам обоим! – Link

Смежные вопросы