Как получить доступ к свойству CGColor UIColor в CGContextSetFillColorWithColor?

CGContextSetFillColorWithColor(g, [UIColor greyColor].CGColor);

Я пытаюсь следовать книге О'Рейли «Разработка игр для iPhone», но на странице 73, глава 3, я получаю эту ошибку:

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

Согласно странице с ошибками, это неподтвержденная ошибка в книге. Каким функциональным кодом можно заменить эту строку?

Дополнительная информация

Пример проекта можно загрузить здесь.

Я столкнулся с ошибкой в ​​функции рендеринга, следуя инструкциям книги со страницы 72 на страницу 73, чтобы создать класс gsMain (он отличается от примера проекта pg77) в функции рендеринга gsMain.m.

Фрагмент кода, предписываемый в книге для создания класса gsMain, выглядит следующим образом:

//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

Предполагается, что Chapter3_Example_p77 показывает результат упражнений со страниц 71 по 77, но он сильно отличается от данных инструкций, приведенных на страницах 71–77. Следующий код представляет собой готовый компилируемый класс, загруженный по приведенной выше ссылке.

//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

person Azeworai    schedule 02.05.2010    source источник


Ответы (3)


А как насчет [ [ UIColor grayColor ] CGColor ]?

Вы используете последнюю версию SDK? Я предполагаю, что ваш заголовок UIColor.h имеет свойство для CGColor? (Я бы проверил ваши настройки SDK — когда я открывал пример проекта, он был установлен на iOS 3.x)


В Swift 3.x: UIColor.gray.cgColor

person nielsbot    schedule 31.12.2013

Я скомпилировал пример p77 для Simulator 3.1.3 и не столкнулся ни с какими предупреждениями или ошибками компилятора.

Код:

- (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]]];

    //...
}

кажется, компилируется нормально. Возможно, вы могли бы указать, какой из трех примеров вы компилируете и для какой целевой версии ОС?

person Alex Reynolds    schedule 02.05.2010
comment
Спасибо за запуск этой компиляции. С вашей помощью я, наконец, вижу проблему. Я компилирую версию, которую я создал, следуя инструкциям книги (в дополнительных деталях вопроса). Что должно привести к скомпилированному вами примеру p77. Функция рендеринга в «результате стр. 77» сильно отличается от инструкций книги на стр. 71–73. Я думаю, что мне просто нужно скопировать класс gsMain p77 вместо того, чтобы следовать инструкциям в настоящей книге. - person Azeworai; 02.05.2010
comment
Я начал со ссылки на пример проекта p71, и я компилирую для iPhoneOS 3.1.2. - person Azeworai; 02.05.2010

Убедитесь, что вы #include <UIKit/UIKit.h>.

И это -grayColor, а не -greyColor.

person kennytm    schedule 02.05.2010
comment
Ага понял спасибо. Я просто скопировал текст, чтобы показать инструкции к книге. - person Azeworai; 02.05.2010