iOS的 - 与父母石英绘制发行/子视图

问题描述:

方案iOS的 - 与父母石英绘制发行/子视图

我有两个看法。一个是“父”视图,其中包含执行绘图的“子视图”。我将代码中的孩子称为QuartzView。 QuartzView知道如何绘制一个正方形到它自己的上下文。

问题

当我告诉QuartzView它是self绘制一个正方形它这样做符合市场预期。当我使用父视图来告诉QuartsView在它的self上绘制一个正方形时,它会在屏幕左下角以大约1/5的预期大小绘制正方形。

问题

我认为这里有一些父/子或环境问题,但我不知道它们是什么。我怎样才能让两个方格在同一个地方以完全相同的尺寸画出来?

家长ViewController

- (void)drawASquare { 

    // this code draws the "goofy" square that is smaller and off in the bottom left corner 
    x = qv.frame.size.width/2; 
    y = qv.frame.size.height/2; 
    CGPoint center = CGPointMake(x, y); 
    [qv drawRectWithCenter:center andWidth:50 andHeight:50 andFillColor:[UIColor blueColor]]; 

} 

儿童QuartzView

- (void)drawRect:(CGRect)rect 
{ 
    self.context = UIGraphicsGetCurrentContext(); 
    UIColor *color = [UIColor colorWithRed:0 green:1 blue:0 alpha:0.5]; 

    // this code draws a square as expected 
    float w = self.frame.size.width/2; 
    float h = self.frame.size.height/2; 
    color = [UIColor blueColor]; 
    CGPoint center = CGPointMake(w, h); 
    [self drawRectWithCenter:center andWidth:20 andHeight:20 andFillColor:color]; 
} 

- (void)drawRectWithCenter:(CGPoint)center andWidth:(float)w andHeight:(float)h andFillColor:(UIColor *)color 
{ 
    CGContextSetFillColorWithColor(self.context, color.CGColor); 
    CGContextSetRGBStrokeColor(self.context, 0.0, 1.0, 0.0, 1); 

    CGRect rectangle = CGRectMake(center.x - w/2, center.x - w/2, w, h); 

    CGContextFillRect(self.context, rectangle); 
    CGContextStrokeRect(self.context, rectangle); 
} 

  • 的混浊是两个正方形相同
  • 我关掉“自动调整子视图”,没有明显的区别
  • view.contentScaleFactor = [[UIScreen mainScreen] scale];并没有帮助

编辑

我注意到,该广场的x/y值绘制从开始时父左下角为0,0,而通常0,0为左上角。

UIGraphicsGetCurrentContext()的返回值是唯一的方法drawRect内有效。你不能也不能用任何其他方法使用该上下文。所以self.context属性应该只是一个局部变量。

drawRectWithCenter方法中,您应该将所有参数存储在属性中,然后请求使用[self setNeedsDisplay]更新视图。那样的话,框架将会调用drawRect这个新的信息。该drawRectWithCenter方法应该是这个样子

- (void)drawRectWithCenter:(CGPoint)center andWidth:(float)w andHeight:(float)h andFillColor:(UIColor *)color 
{ 
    self.showCenter = center; 
    self.showWidth = w; 
    self.showHeight = h; 
    self.showFillColor = color; 
    [self setNeedsDisplay]; 
} 

当然,在drawRect功能需要采取这些信息,并做相应的图纸。

+2

这是一个没有明确提到的好处 - 不要试图存储和重用图形上下文。 – Caleb

+1

这个答案的第一句话通常不是真的,但为了这个问题就足够接近了。 UIGraphicsGetCurrentContext()有效的地方还有其他有效的地方。但是OP没有使用这些情况。 – rmaddy

+0

@rmaddy不够公平。这有点像说你不能拿一个负数的平方根。最终,学生准备理解更先进的概念,但最初最好保持简单。 – user3386109

我假设这里有一些家长/孩子或上下文问题,但我不确定他们是什么。我怎样才能让两个方格在同一个地方以完全相同的尺寸画出来?

您通常不需要担心图形上下文中你-drawRect:方法,因为可可触摸将设置上下文你叫-drawRect:之前。但是视图控制器中的-drawASquare方法调用-drawRectWithCenter:...以在正常绘制过程之外绘制,因此不会为您的视图设置上下文。你应该真的有看法在-drawRect:的绘图。如果您的视图控制器希望使视图重绘,它应该叫-setNeedsDisplay,如:

[qv setNeedsDisplay]; 

这将视图添加到图纸列表,图形系统将设置图形上下文并调用视图的-drawRect:为你。

我注意到,当从左下角开始绘制父元素时,正方形的x/y值为0,0,而通常0,0是左上角。

UIKit和Core Animation使用左上角的原点,但Core Graphics(又名Quartz)通常使用左下角的原点。该文件说:

The default coordinate system used by Core Graphics framework is LLO-based.

+0

这当然是新的信息,但它只是让我到目前为止。因为两次使用同一个视图的方法,为什么一个正方形绘制到UIKit而另一个绘制到Quartz? – Jacksonkr

+1

@Jacksonkr因为只有在调用'-drawRect:'时才设置上下文。我早点击了提交按钮,更新了我的答案。往上看。 – Caleb