【问题标题】:What is the best technique to render circles in iOS?在 iOS 中渲染圆圈的最佳技术是什么?
【发布时间】:2013-08-21 00:11:03
【问题描述】:

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

使用像 circle-icon.pngcircle-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 种方法的确切性能和维护权衡是什么?

【问题讨论】:

  • 使用这三者编写一个测试应用程序并通过 Instruments 运行它。然后你会根据自己的需要知道确切的答案。
  • 这可能有助于指示您正在绘制多少个圆圈,以及将绘制的大小范围(因为,例如,如果圆圈很大,UIImage 方法将会进行内存权衡)。如果性能是关键,我建议您对这些方法进行基准测试。我希望 UIImage 最快,而 CG* 方法使用最少的内存。
  • 虽然我知道我可以自己进行基准测试,但我想了解一些通用的渲染最佳实践以及是否有已知的基准。
  • 让我们说它们是图标大小为了争论...... 60x60 @ 2x。

标签: ios objective-c rendering


【解决方案1】:

您忽略了另一个非常合乎逻辑的选择,UIBezierPathCAShapeLayer。创建一个圆形的UIBezierPath,创建一个使用该UIBezierPathCAShapeLayer,然后将该层添加到您的视图/层层次结构中。

  1. Add the QuartzCore framework to your project.

  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 实现或 CAShapeLayer 实现比 PNG 文件或带圆角的 UIView 对象更有意义。

【讨论】:

    【解决方案2】:

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

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

    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);
    

    【讨论】:

      【解决方案3】:

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

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

      1. 圆角速度很慢而且不直观
      2. 如果您决定更改颜色等操作,使用图像文件将是一个问题。此外,有时图像在缩放后看起来并不那么好。

      【讨论】:

      • 我在问这个问题时有这种感觉,但我想我应该让社区提供一些反馈:) 谢谢。
      猜你喜欢
      • 1970-01-01
      • 2016-11-17
      • 1970-01-01
      • 2017-05-24
      • 2013-03-02
      • 1970-01-01
      • 2018-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多