4

在 iOS 中渲染不透明的非渐变圆形的统一颜色时,似乎有三种可能的技术:

使用 和 之类circle-icon.png的图像circle-icon@2px.png。然后,可以实现以下代码让 iOS 自动呈现适当的大小:

UIImage *image = [UIImage imageNamed:@"circle-icon"];
self.closeIcon = [[UIImageView alloc] initWithImage:image];
self.closeIcon.frame = CGRectMake(300, 16, image.size.width, image.size.height);

渲染圆角并使用图层,如下所示:。

self.circleView = [[UIView alloc] initWithFrame:CGRectMake(10,20,100,100)];
circleView.alpha = 0.5;
self.circleView.layer.cornerRadius = 50;
self.circleView.backgroundColor = [UIColor blueColor];

使用本机绘图库,例如CGContextFillEllipseInRect

这 3 种方法的确切性能和维护权衡是什么?

4

3 回答 3

3

最清晰和最好看的结果是绘制出与您想要的圆圈大小完全相同的图像。如果您正在调整圆圈的大小,您通常不会得到您想要的外观,并且会产生一些与它们相关的开销。

我认为您在清洁度和速度方面的最佳表现将来自使用核心图形及其在正方形中的添加椭圆:

CGPathRef roundPath = CGPathCreateMutable();       
CGRect rectThatIsASquare = CGRectMake(0, 0, 40, 40);
CGPathAddEllipseInRect(roundPath, NULL, rectThatIsASquare);
CGContextSetRGBFillColor(context, 0.7, 0.6, 0.5, 1.0);

CGContextFillPath(context);
于 2013-08-21T00:51:51.743 回答
3

您忽略了另一个非常合乎逻辑的选择,UIBezierPath并且CAShapeLayer. 创建UIBezierPaththat is a circle,创建CAShapeLayer使用 thatUIBezierPath的,然后将该层添加到您的视图/层层次结构。

  1. 将 QuartzCore 框架添加到您的项目中。

  2. 二、导入相应的header:

    #import <QuartzCore/QuartzCore.h>
    
  3. 然后你可以添加一个CAShapeLayer到你的视图层:

    UIBezierPath *path = [UIBezierPath bezierPath];
    [path addArcWithCenter:CGPointMake(self.view.bounds.size.width / 2.0, self.view.bounds.size.height / 2.0) radius:self.view.bounds.size.width * 0.40 startAngle:0 endAngle:M_PI * 2.0 clockwise:YES];
    CAShapeLayer *layer = [[CAShapeLayer alloc] init];
    layer.path = [path CGPath];
    layer.fillColor = [[UIColor blueColor] CGColor];
    [self.view.layer addSublayer:layer];
    

我认为 CoreGraphics 实现或此实现比 PNG 文件或圆角对象CAShapeLayer更有意义。UIView

于 2013-08-21T01:33:46.630 回答
1

就个人而言,我认为您对问题的思考过度了。如果您只画几个圆圈,那么无论您决定什么,对性能/维护的影响都将非常小,即使您将其优化到地狱,您的用户也不会从中获得任何好处。做你现在正在做的任何事情;专注于使应用程序的内容很棒,如果您真的需要,稍后再恢复性能。

话虽如此,我建议使用绘图库。

  1. 圆角很慢而且不直观
  2. 如果您决定执行更改颜色等操作,使用图像文件将是一个问题。此外,有时图像在缩放后看起来并不那么好。
于 2013-08-21T00:25:40.887 回答