У меня есть контроллер вида, представление которого состоит из выпадающего списка прокрутки, управляемого двумя кнопками (предыдущий и следующий). В этом представлении прокрутки представлены несколько пользовательских представлений, каждый из которых имеет размер одной страницы.Плохая производительность, загрузка прокрутки.
Когда я загружаю основной вид, режим прокрутки настроен таким образом, чтобы содержать все эти подзоны. Производительность моего приложения в настоящее время неприемлема в этой области, так как загрузка изображения занимает около 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, я был бы очень признателен
Не добавляйте и не изменяйте subviews в 'drawRect:'. Каждый раз, когда вызывается 'drawRect:', вы добавляете еще один набор подзапросов, не удаляя те, которые уже есть. –
Shift-⌘-J, метод извлечения :) – highlycaffeinated
Не могли бы вы рассказать об экстракте? Я думаю, вы говорите, что этот код не должен быть в лифте, но я не знаю, куда еще он должен идти? – Jack