У меня есть сетка из 30 UIB-кнопок и, возможно, даже больше, подкласс для рендеринга с использованием слоев: основание CALayer
, CAShapeLayer
, CAGradientLayer
и CATextLayer
. Я пытаюсь минимизировать общее время, необходимое для рендеринга / отображения кнопок при загрузке соответствующего файла XIB. Если я просто настрою каждую кнопку по очереди на viewDidLoad
, то время, необходимое для появления представления, составляет около 5-6 секунд, что явно слишком много.
Для ускорения настройки кнопок я использую Grand Central Dispatch следующим образом. В viewDidLoad я настраиваю каждый слой кнопок, используя dispatch_async
в глобальной очереди (добавляя к базовому слою фигуру и слои градиента), чтобы кнопки могли отображаться в другом потоке. В конце блока CATextLayer добавляется в слой градиента.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
CGRect base_bounds = CGRectMake(0, 0, self.layer.bounds.size.width, self.layer.bounds.size.height - self.layer.bounds.size.height * 0.10f);
CGPoint move_point = CGPointMake(0.0f, base_bounds.size.height * 0.10f);
self.layer.masksToBounds = NO;
baseLayer = [CALayer layer];
baseLayer.cornerRadius = 10.0;
baseLayer.shadowOffset = CGSizeMake(0.0f, 2.0f);
baseLayer.shadowOpacity = 1.5f;
baseLayer.shadowColor = [UIColor blackColor].CGColor;
baseLayer.shadowRadius = 2.5f;
baseLayer.anchorPoint = CGPointMake(0.5f, 0.5f);
baseLayer.position = move_point;
CAShapeLayer *shape = [CALayer layer];
shape.bounds = base_bounds;
shape.cornerRadius = 10.0;
shape.anchorPoint = CGPointMake(0.0f, 0.0f);
shape.position = move_point;
shape.backgroundColor = [UIColor darkGrayColor].CGColor;
gradient = [CAGradientLayer layer];
gradient.anchorPoint = CGPointMake(0.0f, 0.0f);
gradient.position = CGPointMake(0.0f, 0.0f);
gradient.bounds = base_bounds;
gradient.cornerRadius = 10.0;
gradient.borderColor = [UIColor colorWithRed:0.72f
green:0.72f
blue:0.72f
alpha:1.0].CGColor;
gradient.borderWidth = 0.73;
gradient.colors = [NSArray arrayWithObjects:
(id)[UIColor whiteColor].CGColor,
(id)[UIColor whiteColor].CGColor,
nil];
[baseLayer addSublayer:shape];
[baseLayer addSublayer:gradient];
[self.layer addSublayer:baseLayer];
[textLayer setBounds:gradient.bounds];
[textLayer setPosition:CGPointMake(CGRectGetMidX(textLayer.bounds), CGRectGetMaxY(textLayer.bounds) - 6)];
[textLayer setString:self.titleLabel.text];
[textLayer setForegroundColor:[UIColor blackColor].CGColor];
[gradient addSublayer:textLayer];
});
При таком подходе общее время сокращается примерно до 2-3 секунд. Мне интересно, если кто-нибудь может предложить более быстрый способ рендеринга кнопок. Обратите внимание, что меня не интересует какое-либо решение, которое отказывается от использования слоев.
Заранее спасибо.