我有兴趣在子类 UIView 中覆盖 drawRect 以为 tableView 创建简单的纹理背景。我已经完成了我的目标,但表现并不是那么出色。我知道这对于像我这样的新手来说是一个普遍的问题。但是,由于这是我第一次使用 CoreGraphics,我无法诊断问题的根源。
通过性能打击,我的意思是在 tableViewController 通过导航控制器动画之前存在滞后。如果你愿意,它会挂起。第一次启动我的任何 UITableViewController 时都会出现性能下降,并使用 [[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