views:

167

answers:

1

Hi,

I'm relatively new to Objective-C + Quartz and am running into what is probably a very simple issue. I have a custom UIView sub class which I am using to draw simple rectangles via Quartz. However I am trying to hook up an NSTimer so that it draws a new object every second, the below code will draw the first rectangle but will never draw again. The function is being called (the NSLog is run) but nothing is draw.

Code:

- (void)drawRect:(CGRect)rect {
    context = UIGraphicsGetCurrentContext();

    [self step:self];
    [NSTimer scheduledTimerWithTimeInterval:(NSTimeInterval)(2) target:self selector:@selector(step:) userInfo:nil repeats:TRUE];

}

- (void) step:(id) sender {
    static double trans = 0.5f;

    CGContextSetRGBFillColor(context, 1, 0, 0, trans);
    CGContextAddRect(context, CGRectMake(10, 10, 10, 10));
    CGContextFillPath(context);

    NSLog(@"Trans: %f", trans);

    trans += 0.01;
}

context is in my interface file as:

CGContextRef context;

Any help will be greatly appreciated!

+1  A: 

Your example won't work. The reason is that drawRect: is called for you when the view requires drawing, and it can't draw on its own.

Instead, try using your timer from outside of drawRect: (viewDidLoad comes to mind), and each time add an object to draw to a list, and call [view setNeedsDisplay] to request it to be redrawn. There are other techniques if you need stricter control, but it's a good idea to master the basics of application flow first.

Paul Lynch
Exactly right. Schedule the repeating timer in your `viewDidLoad` method, and have your `update` method call `setNeedsDisplay`. You should not perform any drawing code outside of a `drawRect` method unless you have set up a drawing context beforehand. Using the one from a previous call to `drawRect` is not going to work, since that context will no longer be around after `drawRect` has finished.
e.James