У меня здесь интересная загадка. Мой проект cocos2d использует UIView для отображения более привлекательных всплывающих окон, чем обычный просмотр предупреждений. Чтобы быть более гибким по размеру всплывающего окна, я рисую фон в методе drawRect.CoreGraphics drawRect в проекте cocos2d EXEC BAD ACCESS
Но первая иерархия, как я реализую cocos2d и UIKit:
Каждый UIKit элемент добавляется в RootViewController. Каждый CCNode для EAGLView. (Если у кого-то есть лучшее решение, чтобы смешать этот мир, не ждите, чтобы рассказать мне!) К сожалению, каждый UIKit вид перед узлами кокоса.
Все работает нормально, когда я добавляю первое всплывающее окно к RootViewController. Но если я удалю первое всплывающее окно и добавлю новый в RootViewController, произойдет плохой доступ. Он падает только в сочетании с cocos2d.
Я использую код из учебника Ray Wenderlichs CoreGraphics 101.
контекст и strokeColor не ноль. Другая важная информация: я использую ARC и поддерживаю iOS 4.2 и выше.
Полный код можно найти на raywenderlich.com или ниже
void drawLinearGradient(CGContextRef context, CGRect rect, CGColorRef startColor, CGColorRef endColor)
{
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGFloat locations[] = { 0.0, 1.0 };
NSArray *colors = [NSArray arrayWithObjects:(__bridge id)startColor, (__bridge id)endColor, nil];
CGGradientRef gradient = CGGradientCreateWithColors(colorSpace,
(__bridge CFArrayRef) colors, locations);
CGPoint startPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMinY(rect));
CGPoint endPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect));
CGContextSaveGState(context);
CGContextAddRect(context, rect);
CGContextClip(context);
CGContextDrawLinearGradient(context, gradient, startPoint, endPoint, 0);
CGContextRestoreGState(context);
CGGradientRelease(gradient);
CGColorSpaceRelease(colorSpace);
}
CGRect rectFor1PxStroke(CGRect rect)
{
return CGRectMake(rect.origin.x + 0.5, rect.origin.y + 0.5, rect.size.width - 1, rect.size.height -1);
}
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
CGRect frame = CGRectInset(self.bounds, 2, 2);
CGContextSetShadowWithColor(context, CGSizeMake(0, 0), 3.0, shadowColor);
CGRect strokeRect = CGRectInset(frame, -2.0, -2.0);
CGContextSetStrokeColorWithColor(context, strokeColor);
CGContextSetLineWidth(context, 2.0);
CGContextStrokeRect(context, rectFor1PxStroke(strokeRect));
drawLinearGradient(context, frame, gradient1, gradient2);
}
Этот ответ решает эту проблему: http://stackoverflow.com/questions/9963530/app-crashes-when-using-bridge-for-coregraphics-gradient-on-arc – zeiteisen
zeiteisen ......... проверить этот форум http://www.cocos2d-iphone.org/forum/topic/6889 там обертка для загрузки представлений UIKit сверху (как вы хотите иерархию представлений) EAGLView. – Ankur