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
功能需要采取这些信息,并做相应的图纸。
我假设这里有一些家长/孩子或上下文问题,但我不确定他们是什么。我怎样才能让两个方格在同一个地方以完全相同的尺寸画出来?
您通常不需要担心图形上下文中你-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.
这是一个没有明确提到的好处 - 不要试图存储和重用图形上下文。 – Caleb
这个答案的第一句话通常不是真的,但为了这个问题就足够接近了。 UIGraphicsGetCurrentContext()有效的地方还有其他有效的地方。但是OP没有使用这些情况。 – rmaddy
@rmaddy不够公平。这有点像说你不能拿一个负数的平方根。最终,学生准备理解更先进的概念,但最初最好保持简单。 – user3386109