我在UIView上有一个简单的代码绘制方形图案,大小PSIZE = 50。 当我在零(0,0)点开始绘制时,每件事情都可以。 当我将上下文转换为另一个不是PSIZE的倍数时,那么该模式仍然可以工作但不能从所需的点开始。 当我转换为点(75,75)和原点时,会产生以下图像。 任何身体都可以帮助我找到从任何一点开始绘制的方法,只需要原始的细胞模式点。
#define PSIZE 50
void backgroundLinePattern (void *info, CGContextRef context)
{
UIColor * lineColor = [UIColor yellowColor];
CGContextSetStrokeColorWithColor(context, lineColor.CGColor);
CGContextMoveToPoint(context, 0, 0);
CGContextSetLineWidth(context, PSIZE * 0.1);
CGContextAddLineToPoint(context, 0, PSIZE);
CGContextAddLineToPoint(context, PSIZE, PSIZE);
CGContextAddLineToPoint(context, PSIZE, 0);
CGContextAddLineToPoint(context, 0, 0);
//CGContextAddLineToPoint(context, PSIZE, PSIZE);
CGContextStrokePath(context);
}
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
// Drawing code
}
-(void) drawLayer:(CALayer *)layer inContext:(CGContextRef)context{
//CGContextScaleCTM(context, 10, 10);
CGContextSaveGState(context);
CGColorSpaceRef patternSpace = CGColorSpaceCreatePattern(NULL);
CGContextSetFillColorSpace(context, patternSpace);
CGColorSpaceRelease(patternSpace);
//CGContextTranslateCTM(context, 75, 75); //TRANSLATE LINE
//CGAffineTransform t = CGAffineTransformMakeScale(50, 50);
CGRect r = CGRectMake(-0, -0, PSIZE, PSIZE);
const CGPatternCallbacks callbacks = { 0, &backgroundLinePattern,NULL };
CGPatternRef pattern = CGPatternCreate(NULL,
r,
CGAffineTransformIdentity,
PSIZE,
PSIZE,
kCGPatternTilingConstantSpacing,
true,
&callbacks);
CGFloat alpha = 1.0;
CGContextSetFillPattern(context, pattern, &alpha);
CGPatternRelease(pattern);
CGRect rect = CGRectMake(0, 0, 400, 400);
CGContextFillRect(context,rect);
CGContextRestoreGState(context);
}
答案 0 :(得分:1)
整个图形上下文重复模式。您的绘图仅仅是图案区域的一个窗口。因此,如果移动图形并且希望图案从相对于移位图形的相同位置开始,则必须单独移动图案的起点。研究CGContextSetPatternPhase()
以了解如何执行此操作。