CGPattern绘制不是以所需的点开始

时间:2014-05-27 12:52:26

标签: ios objective-c macos

我在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);
}

enter link description here

enter link description here

1 个答案:

答案 0 :(得分:1)

整个图形上下文重复模式。您的绘图仅仅是图案区域的一个窗口。因此,如果移动图形并且希望图案从相对于移位图形的相同位置开始,则必须单独移动图案的起点。研究CGContextSetPatternPhase()以了解如何执行此操作。