How to access the CGColor property of UIColor in CGContextSetFillColorWithColor?

29,837

Solution 1

What about [ [ UIColor grayColor ] CGColor ]?

Are you using the latest SDK? I assume your UIColor.h header has a property for CGColor? (I would check your SDK settings--when I opened the sample project it was set to iOS 3.x)


In Swift 3.x: UIColor.gray.cgColor

Solution 2

I compiled the p77 example for Simulator 3.1.3 and did not run into any compiler warnings or errors.

The code:

- (void)drawRect:(CGRect)rect {
    CGContextRef g = UIGraphicsGetCurrentContext();
    //fill background with gray
    CGContextSetFillColorWithColor(g, [UIColor grayColor].CGColor);
    CGContextFillRect(g, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height));
    //draw text in black.
    CGContextSetFillColorWithColor(g, [UIColor blackColor].CGColor);
    [@"O'Reilly Rules!" drawAtPoint:CGPointMake(10.0, 20.0) withFont:[UIFont systemFontOfSize:[UIFont systemFontSize]]];

    //...
}

appears to compile okay. Perhaps you might specify which of the three examples you're compiling and for what target OS version?

Solution 3

Make sure you #include <UIKit/UIKit.h>.

And it is -grayColor, not -greyColor.

Share:
29,837
Azeworai
Author by

Azeworai

Updated on January 30, 2020

Comments

  • Azeworai
    Azeworai about 4 years
    CGContextSetFillColorWithColor(g, [UIColor greyColor].CGColor);
    

    I'm trying to follow O'Reilly's book, iPhone Game Development, but on page 73 Chapter 3 I get this error:

    error: request for member 'CGColor' in something not a structure or union
    

    According to the book's errata page this is an unconfirmed errata in the book. What functional code can that line be replaced with?

    Additional Details

    The example project can be downloaded here.

    I was encountering the error at the render function by following the book's instructions from page 72 to page 73 to build the gsMain class (its different from the example project pg77) at the render function of gsMain.m

    The code snippet that the book instructs to build gsMain class is as followed:

    //gsMain.h
    @interface gsTest : GameState { }  
    @end
    
    //gsMain.m 
    @implementation gsMain 
    
    -(gsMain*) initWithFrame:(CGRect)frame andManager:(GameStateManager*)pManager 
    
        { 
            if (self = [super initWithFrame:frame andManager:pManager]) { 
            NSLog(@"gsTest init"); 
        } 
    return self; 
    } 
    
    -(void) Render 
    { 
        CGContextRef g = UIGraphicsGetCurrentContext(); 
        //fill background with gray 
        CGContextSetFillColorWithColor(g, [UIColor greyColor].CGColor); //Error Occurs here
        CGContextFillRect(g, CGRectMake(0, 0, self.frame.size.width, 
        self.frame.size.height)); 
    //draw text in black 
    CGContextSetFillColorWithColor(g, [UIColor blackColor].CGColor); 
    [@"O'Reilly Rules!" drawAtPoint:CGPointMake(10.0,20.0) 
            withFont:[UIFont systemFontOfSize:[UIFont systemFontSize]]]; 
    } 
    -(void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event 
    { 
        UITouch* touch = [touches anyObject]; 
        NSUInteger numTaps = [touch tapCount]; 
        //todo: implement touch event code here 
    } 
    @end
    

    The Chapter3_Example_p77 is supposed to show the result of the exercises from page 71 to 77 but it's very different from the given instructions given in 71 to 77. The following code is the completed, compilable class downloaded from the above link.

    //gsMain.h
    #import <Foundation/Foundation.h>
    #import "GameState.h"
    @interface gsMain : GameState {
    
    }
    
    @end
    
    //  gsMain.m
    //  Example
    //  Created by Joe Hogue and Paul Zirkle
    
    #import "gsMain.h"
    #import "gsTest.h"
    #import "Test_FrameworkAppDelegate.h"
    
    @implementation gsMain
    
    -(gsMain*) initWithFrame:(CGRect)frame andManager:(GameStateManager*)pManager {
    if (self = [super initWithFrame:frame andManager:pManager]) {
        //do initializations here.
    }
    return self;
    }
    
    - (void) Render {
    [self setNeedsDisplay]; //this sets up a deferred call to drawRect.
    }
    
    - (void)drawRect:(CGRect)rect {
    CGContextRef g = UIGraphicsGetCurrentContext();
    //fill background with gray
    CGContextSetFillColorWithColor(g, [UIColor grayColor].CGColor);
    CGContextFillRect(g, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height));
    //draw text in black.
    CGContextSetFillColorWithColor(g, [UIColor blackColor].CGColor);
    [@"O'Reilly Rules!" drawAtPoint:CGPointMake(10.0, 20.0) withFont:
        [UIFont systemFontOfSize:   [UIFont systemFontSize]]];
    
    //fps display from page 76 of iPhone Game Development
    int FPS = [((Test_FrameworkAppDelegate*)m_pManager) getFramesPerSecond];
    NSString* strFPS = [NSString stringWithFormat:@"%d", FPS];
    [strFPS drawAtPoint:CGPointMake(10.0, 60.0) withFont:[UIFont systemFontOfSize:
        [UIFont systemFontSize]]];
    }
    
    //this is missing from the code listing on page 77.
    -(void) touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
    {
        UITouch* touch = [touches anyObject];
        NSUInteger numTaps = [touch tapCount];
        if( numTaps > 1 ) {
        [m_pManager doStateChange:[gsTest class]];
    }
    }
    
    @end