使用CoreGraphics循环绘制创建性能问题

时间:2013-03-19 19:00:51

标签: performance uiview core-graphics drawrect

我感兴趣的是在子类UIView中覆盖drawRect,为tableView创建一个简单的纹理背景。我已经完成了我的目标,但表现并不是那么好。我理解这对像我这样的新手来说是个常见问题。但是,由于这是我第一次参加CoreGraphics,我在诊断问题根源时遇到了问题。

通过性能命中,我的意思是在通过导航控制器对tableViewController进行动画处理之前存在延迟。它会挂起,如果你愿意的话。性能命中在我的任何UITableViewControllers第一次出现时,使用[[self tableView] setBackgroundView:level1View];的相应设置。表视图的后续呈现具有0性能命中。当我没有将backgroundView属性设置为自定义绘制视图时,性能问题就消失了。任何想法都非常感激。

一些警告:我宁愿不为此平铺图像,除非这是唯一有效的方法。 (试着学习什么不学习。)另外,我的代码基于这里的教程:http://www.raywenderlich.com/2167/core-graphics-101-patterns

#import "HordLevel1View.h"

static inline double radians (double degrees) { return degrees * M_PI/180; }
void MyDrawColoredPattern1 (void *info, CGContextRef context)
{

UIColor * dotColor = [UIColor colorWithHue:0 saturation:0 brightness:0.90 alpha:1.0];
UIColor * shadowColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.2];

CGContextSetFillColorWithColor(context, dotColor.CGColor);
CGContextSetShadowWithColor(context, CGSizeMake(0, 0), .25, shadowColor.CGColor);

//First line of circles
CGContextAddArc(context, 1, 1, 1, 0, radians(360), 0);
CGContextFillPath(context);

CGContextAddArc(context, 3, 2, 1, 0, radians(360), 0);
CGContextFillPath(context);

CGContextAddArc(context, 5, 0, 1, 0, radians(360), 0);
CGContextFillPath(context);

CGContextAddArc(context, 5, 3, 1, 0, radians(360), 0);
CGContextFillPath(context);

CGContextAddArc(context, 1, 4, 1, 0, radians(360), 0);
CGContextFillPath(context);

CGContextAddArc(context, 3, 5, 1, 0, radians(360), 0);
CGContextFillPath(context);

CGContextAddArc(context, 5, 6, 1, 0, radians(360), 0);
CGContextFillPath(context);

}


@implementation HordLevel1View

- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
    // Initialization code
}
return self;
}

- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();

UIColor * bgColor = [UIColor colorWithHue:0 saturation:0 brightness:0.85 alpha:1.0];
CGContextSetFillColorWithColor(context, bgColor.CGColor);
CGContextFillRect(context, rect);

static const CGPatternCallbacks callbacks = { 0, &MyDrawColoredPattern1, NULL };

CGContextSaveGState(context);
CGColorSpaceRef patternSpace = CGColorSpaceCreatePattern(NULL);
CGContextSetFillColorSpace(context, patternSpace);
CGColorSpaceRelease(patternSpace);

CGPatternRef pattern = CGPatternCreate(NULL,
                                       rect,
                                       CGAffineTransformIdentity,
                                       6,
                                       6,
                                       kCGPatternTilingConstantSpacing,
                                       true,
                                       &callbacks);
CGFloat alpha = 1.0;
CGContextSetFillPattern(context, pattern, &alpha);
CGPatternRelease(pattern);
CGContextFillRect(context, self.bounds);
CGContextRestoreGState(context);
}


@end 

1 个答案:

答案 0 :(得分:0)

抱歉没有人知道,希望我的回复仍然相关!我相信你自三月以来已经走了很长的路。

我首先想到的是,图像不仅是一种快速的方法,它的代码更简单,也更灵活。但是假设您需要动态绘制,因为内容会根据用户输入从根本上改变(我认为这不太可能:)。

在这种情况下,还有一些想法:

  • 创建模式ONCE,而不是每次drawRect调用,而不是每个单元格视图一次。
  • 更好的是,使用你的模式创建一个UIImage,并在你的单元格中使用它
  • 使用模式的正确边界(我认为你制作的图案大小与整个视图一样)