在iOS中渲染圈子的最佳技巧是什么?

时间:2013-08-21 00:11:03

标签: ios objective-c rendering

在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种方法的确切性能和维护权衡是什么?

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:3)

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

  1. Add the QuartzCore framework to your project

  2. 其次,导入适当的标题:

    UIBezierPath
  3. 然后您可以在视图的图层中添加#import <QuartzCore/QuartzCore.h>

    CAShapeLayer
  4. 我认为CoreGraphics实现或此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]; 实现比PNG文件或带圆角的CAShapeLayer对象更有意义。

答案 2 :(得分:1)

就个人而言,我认为你过分思考这个问题。如果您只是画了几个圈子,那么无论您决定哪种方式,都会对性能/维护产生很小的影响,即使您将其优化到地狱,您的用户也无法获得任何好处。做你现在正在做的事;专注于使应用程序的内容变得更好,如果你真的需要,可以在以后重新开始表现。

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

  1. 圆角很慢而且非直观
  2. 如果您决定更改颜色等内容,则使用图像文件会出现问题。此外,有时在缩放图像后图像看起来不那么好。