Настройка представления для рисования в Objective-C (iPhone)? - PullRequest
2 голосов
/ 01 апреля 2010

Хорошо, я новичок в iPhone и других вещах, но я даже не занимаюсь программированием, у меня многолетний опыт работы с ActionScript 2.0 и 3.0, я хочу настроить представление, которое я тоже могу передать переменные. Представление будет рисовать все с помощью кварца.

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

Я хотел сделать как:

[myView setNeedsDisplay];

но я должен был сделать

[(View*)self.view setNeedsDisplay];

на самом деле не сработало ...

Хорошо, теперь я получил:

- (void) viewDidLoad {
    [super viewDidLoad];
 viewClass = [[View class] retain];
 gameView = [[[viewClass alloc] initWithFrame: CGRectZero] retain];
 [gameView setNeedsDisplay];
}

Это в моем drawInContext: context, который вызывается drawRect:

Кроме того, мой drawRect выполняет [self drawInContext: UIGraphicsGetCurrentContext ()];

CGContextSetStrokeColorWithColor(context, [[UIColor blackColor] CGColor]);
CGContextSetLineWidth(context, 3.0);
CGContextSetLineCap(context, kCGLineCapRound);
CGContextSetLineJoin(context, kCGLineJoinRound);
CGMutablePathRef aPath = CGPathCreateMutable();
CGPathMoveToPoint(aPath, nil, 5, 5);
CGPathAddLineToPoint(aPath, nil, 45, 43);
CGContextAddPath(context, aPath);
CGContextStrokePath(context);

Ничего не происходит.

Помощь

О да, я получаю эту ошибку:: неверный контекст каждый раз, когда я использую эти функции. : [

Спасибо!

1 Ответ

3 голосов
/ 01 апреля 2010

Ты слишком усложняешь это. Не звоните drawInContext с drawRect. Вместо этого просто сделайте это в вашем drawRect методе:

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetStrokeColorWithColor(context, [[UIColor blackColor] CGColor]);
    CGContextSetLineWidth(context, 3.0);
    CGContextSetLineCap(context, kCGLineCapRound);
    CGContextSetLineJoin(context, kCGLineJoinRound);
    CGContextMoveToPoint(context, 5, 5);
    CGContextAddLineToPoint(context, 45, 43);
    CGContextStrokePath(context);
}

Есть пара вещей, которые вы должны отметить в этом коде. Всякий раз, когда вы делаете пользовательский рисунок в UIView, переопределяя drawRect, используйте UIGraphicsGetCurrentContext, чтобы получить ссылку на текущий контекст. Во-вторых, при использовании CGContext нет необходимости создавать новый CGPath. CGContext имеет те же функции рисования, что и CGPath, см. Документы здесь .

Для создания представления все, что вам нужно сделать, это:

gameView = [[YourView alloc] initWithFrame:CGRectZero];

Где YourView - ваш UIView подкласс. Вам не нужно создавать отдельную ссылку на класс (viewClass), и вам также не нужно вызывать retain для объекта UIView, потому что количество сохранений увеличивается уже при его создании. Также обратите внимание, что CGRectZero является прямоугольником размера (0, 0). Если вы хотите, чтобы ваш вид был видимым, вам нужно указать CGRect соответствующего размера вместо CGRectZero.

Надеюсь, это немного прояснит ситуацию.

...