【发布时间】:2023-03-04 12:59:01
【问题描述】:
我有一个由 30 个 UIButtons 组成的网格,甚至可能更多,子类化以使用层进行渲染:一个基础 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 秒。我想知道是否有人可以建议一种更快的方式来呈现按钮。请注意,我对任何放弃使用层的解决方案不感兴趣。
提前谢谢你。
【问题讨论】:
-
您是否使用 Instruments 和 Timing Profile 确定了瓶颈?
-
@MikeWeller:是的,执行我的问题中显示的源代码的时间是 Instruments 报告的时间。
标签: iphone ios cocoa-touch ipad