2010-10-26 4 views
2

У меня есть контроллер вида, представление которого состоит из выпадающего списка прокрутки, управляемого двумя кнопками (предыдущий и следующий). В этом представлении прокрутки представлены несколько пользовательских представлений, каждый из которых имеет размер одной страницы.Плохая производительность, загрузка прокрутки.

Когда я загружаю основной вид, режим прокрутки настроен таким образом, чтобы содержать все эти подзоны. Производительность моего приложения в настоящее время неприемлема в этой области, так как загрузка изображения занимает около 3 секунд. Я заметил, что если я прокомментирую мой метод drawrect на моем пользовательском представлении, производительность будет значительно улучшена. Может кто-то, пожалуйста, взгляните на этот код и посмотрите, что я делаю, так ресурс, который голоден? Я действительно новичок в основной графике и подозреваю, что я делаю что-то явно неправильно.

Благодаря

- (void)drawRect:(CGRect)rect { 
    UILabel *questionNumberLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 40, 200, 50)]; 
    [questionNumberLabel setBackgroundColor:[UIColor clearColor]]; 
    [questionNumberLabel setText:[NSString stringWithFormat:@"Question %i", surveyQuestionNumber]]; 
    [questionNumberLabel setTextAlignment:UITextAlignmentCenter]; 
    [questionNumberLabel setFont:[UIFont boldSystemFontOfSize:28.0]]; 
    [questionNumberLabel setTextColor:[UIColor whiteColor]]; 
    [questionNumberLabel setShadowOffset:CGSizeMake(0, -1.0)]; 
    [questionNumberLabel setShadowColor:[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5]]; 
    [self addSubview:questionNumberLabel]; 
    [questionNumberLabel release]; 

    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGColorRef whiteColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0].CGColor; 
    CGColorRef lightGrayColor = [UIColor colorWithRed:230.0/255.0 green:230.0/255.0 blue:230.0/255.0 alpha:1.0].CGColor; 
    CGColorRef shadowColor = [UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:0.5].CGColor; 
    CGColorRef lightGreenColor = [[UIColor colorWithRed:158.0/255.0 green:192.0/255.0 blue:72.0/255.0 alpha:1.0] CGColor]; 
    CGColorRef darkGreenColor = [[UIColor colorWithRed:102.0/255.0 green:142.0/255.0 blue:66.0/255.0 alpha:1.0] CGColor]; 
    CGColorRef shadowGreenColor = [[UIColor colorWithRed:71.0/255.0 green:100.0/255.0 blue:66.0/255.0 alpha:1.0] CGColor]; 

    CGFloat outerMargin = 20.0f; 
    CGRect outerRect = CGRectInset(self.bounds, outerMargin, outerMargin); 
    CGMutablePathRef outerPath = createRoundedRectForRect(outerRect, 15.0); 

    CGContextSaveGState(context); 
    CGContextSetFillColorWithColor(context, whiteColor); 
    CGContextSetShadowWithColor(context, CGSizeMake(0, 5), 5.0, shadowColor); 
    CGContextAddPath(context, outerPath); 
    CGContextFillPath(context); 
    CGContextRestoreGState(context); 

    CGContextSaveGState(context); 
    CGContextAddPath(context, outerPath); 
    CGContextClip(context); 
    drawLinearGradient(context, outerRect, whiteColor, lightGrayColor); 
    CGContextRestoreGState(context); 

    CGContextSaveGState(context); 
    CGContextSetLineWidth(context, 2.0); 
    CGContextSetStrokeColorWithColor(context, whiteColor); 
    CGContextAddPath(context, outerPath); 
    CGContextStrokePath(context); 
    CGContextRestoreGState(context); 

    CGRect ribbonyRect = CGRectMake(10, 40, 220, 50); 
    CGContextSaveGState(context); 
    CGMutablePathRef ribbonPath = CGPathCreateMutable(); 
    CGPathMoveToPoint(ribbonPath, NULL, ribbonyRect.origin.x, ribbonyRect.origin.y); 
    CGPathAddLineToPoint(ribbonPath, NULL, ribbonyRect.origin.x+ribbonyRect.size.width, ribbonyRect.origin.y); 
    CGPathAddLineToPoint(ribbonPath, NULL, ribbonyRect.origin.x+ribbonyRect.size.width-20, ribbonyRect.origin.y+((ribbonyRect.size.height)/2)); 
    CGPathAddLineToPoint(ribbonPath, NULL, ribbonyRect.origin.x+ribbonyRect.size.width, ribbonyRect.origin.y+ribbonyRect.size.height); 
    CGPathAddLineToPoint(ribbonPath, NULL, ribbonyRect.origin.x, ribbonyRect.origin.y+ribbonyRect.size.height); 
    CGPathCloseSubpath(ribbonPath); 


    CGContextSaveGState(context); 
    CGContextSetShadowWithColor(context, CGSizeMake(0, 5), 5.0, shadowColor); 
    CGContextAddPath(context, ribbonPath); 
    CGContextFillPath(context); 
    CGContextRestoreGState(context); 

    CGContextAddPath(context, ribbonPath); 
    CGContextClip(context); 
    drawLinearGradient(context, ribbonyRect, lightGreenColor, darkGreenColor); 
    CGContextRestoreGState(context); 



    CGContextSaveGState(context); 
    CGContextAddPath(context, ribbonPath); 
    CGContextSetLineWidth(context, 2.0); 
    CGContextSetStrokeColorWithColor(context, lightGreenColor); 
    CGContextStrokePath(context); 
    CGContextRestoreGState(context); 

    CGContextSaveGState(context); 
    CGContextAddPath(context, ribbonPath); 
    CGContextSetLineWidth(context, 1.5); 
    CGContextSetStrokeColorWithColor(context, darkGreenColor); 
    CGContextStrokePath(context); 
    CGContextRestoreGState(context); 


    CGContextMoveToPoint(context, ribbonyRect.origin.x, ribbonyRect.origin.y+ribbonyRect.size.height+1.5); 
    CGContextAddLineToPoint(context, 19.0, ribbonyRect.origin.y+ribbonyRect.size.height+1.5); 
    CGContextAddLineToPoint(context, 19.0, ribbonyRect.origin.y+ribbonyRect.size.height+12.0); 
    CGContextSetFillColorWithColor(context, shadowGreenColor); 
    CGContextFillPath(context); 

    CFRelease(ribbonPath); 
    CFRelease(outerPath); 

    questionTitleLabel = [[UILabel alloc] initWithFrame:CGRectMake(100.0, 110.0, 568.0, 100.0)]; 
    [questionTitleLabel setBackgroundColor:[UIColor clearColor]]; 
    [questionTitleLabel setText:[currentQuestion questionTitle]]; 
    [questionTitleLabel setFont:[UIFont systemFontOfSize:30.0]]; 
    [questionTitleLabel setTextAlignment:UITextAlignmentCenter]; 
    [questionTitleLabel setTextColor:[UIColor grayColor]]; 
    [questionTitleLabel setShadowColor:[UIColor whiteColor]]; 
    [questionTitleLabel setShadowOffset:CGSizeMake(0, -1.0)]; 
    [questionTitleLabel setLineBreakMode:UILineBreakModeWordWrap]; 
    [questionTitleLabel setNumberOfLines:0]; 
    [self addSubview:questionTitleLabel]; 


    questionHintLabel = [[UILabel alloc] initWithFrame:CGRectMake(100.0, 215.0, 568.0, 30.0)]; 
    [questionHintLabel setBackgroundColor:[UIColor clearColor]]; 
    [questionHintLabel setText:[currentQuestion questionHint]]; 
    [questionHintLabel setFont:[UIFont italicSystemFontOfSize:15.0]]; 
    [questionHintLabel setTextAlignment:UITextAlignmentCenter]; 
    [questionHintLabel setTextColor:[UIColor grayColor]]; 
    [questionHintLabel setShadowColor:[UIColor whiteColor]]; 
    [questionHintLabel setShadowOffset:CGSizeMake(0, -1.0)]; 
    [self addSubview:questionHintLabel]; 
} 

Я сделал суть моего последнего кода. Если кто-то может взглянуть на него here, я был бы очень признателен

+0

Не добавляйте и не изменяйте subviews в 'drawRect:'. Каждый раз, когда вызывается 'drawRect:', вы добавляете еще один набор подзапросов, не удаляя те, которые уже есть. –

+1

Shift-⌘-J, метод извлечения :) – highlycaffeinated

+0

Не могли бы вы рассказать об экстракте? Я думаю, вы говорите, что этот код не должен быть в лифте, но я не знаю, куда еще он должен идти? – Jack

ответ

4

Две вещи выпрыгивают из меня.

1.) Создайте свой UILabels в другом месте - возможно, в -viewDidLoad. И выполните необходимую настройку UILabels в -viewDidLoad. Для создания объектов требуется время. Итак, создайте объекты ivars объекта questionXxxLabel.

2.) Вдоль тех же линий создайте эти CGColorRefs в другом месте. Они могут быть статическими классами или иварами, но они должны быть определены один раз и только один раз.

Например, вы можете создать файл colors.h, который может быть включен, если эти цвета могут использоваться.

/* 
* colors.h 
*/ 

// use _COLORS_ to insure that colors.h is not included multiple times 
// i.e., ANSI standard way of constructing an inclusion guard. 

#ifndef _COLORS_ 
#define _COLORS_ 

CGColorRef whiteColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0].CGColor; 
CGColorRef lightGrayColor = [UIColor colorWithRed:230.0/255.0 green:230.0/255.0 blue:230.0/255.0 alpha:1.0].CGColor; 
CGColorRef shadowColor = [UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:0.5].CGColor; 
CGColorRef lightGreenColor = [[UIColor colorWithRed:158.0/255.0 green:192.0/255.0 blue:72.0/255.0 alpha:1.0] CGColor]; 
CGColorRef darkGreenColor = [[UIColor colorWithRed:102.0/255.0 green:142.0/255.0 blue:66.0/255.0 alpha:1.0] CGColor]; 
CGColorRef shadowGreenColor = [[UIColor colorWithRed:71.0/255.0 green:100.0/255.0 blue:66.0/255.0 alpha:1.0] CGColor]; 

#endif // _COLORS_ 
+0

Как и в подклассе UIView, нет метода viewDidLoad, было бы нормально переместить «новички» меток (теперь ivars) в метод init? – Jack

+1

Да, это было бы хорошо. Я должен был заметить, что ... – westsider

+0

Привет, Westsider, где я должен создавать CGColorRefs? Я в замешательстве относительно лучшего места, чтобы добавить их. Я добавил суть вопроса с моим последним кодом. Спасибо – Jack

2

Вы пытались запустить приложение с помощью инструментов? Может быть, это может вам помочь.

Смежные вопросы