我面前有两个Quartz iPhone应用程序。在每个中,对setNeedsDisplay的调用会导致视图重绘自身。但是有一个重要的区别。在一个案例中(Mark / Lamarche的书“开始iPhone开发”中的“Quartz Fun”应用程序),视图每次都是空白。在另一种情况下(我正在处理的应用程序),视图从之前的任何内容开始,并在其上添加新图形。
我无法弄清楚为什么会这样。任何人都可以提醒我吗?
感谢。
编辑#2:我仍然不明白这里发生了什么。但我已经想通过调用来清除我的观点CGContextRef context = UIGraphicsGetCurrentContext();
CGContextClearRect(context, self.frame);
编辑#3:显示缩短的代码:
根据评论者的建议,我编辑了我的应用,以便在代码非常少的情况下发生问题。 [现在问题的形式有点不同,如下所述。]
App代表:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
DiceView *dv = [[DiceView alloc]initWithFrame: window.frame];
[window addSubview:dv];
[dv release];
[window makeKeyAndVisible];
return YES;
}
DiceView:
- (void)drawRect:(CGRect)rect {
static int nDrawrectCalls = 0;
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 1.0);
CGContextSetStrokeColorWithColor(context, (nDrawrectCalls%5==0?[UIColor redColor]:[UIColor greenColor]).CGColor);
CGContextMoveToPoint(context, 10, 30+10*nDrawrectCalls);
CGContextAddLineToPoint(context, 300, 30+10*nDrawrectCalls);
CGContextStrokePath(context);
nDrawrectCalls++;
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
[self setNeedsDisplay];
}
其他一切都只是默认存根方法。
现在为了区别。现在似乎开始用屏幕上的两个触摸开始绘制。换句话说,在触摸#2之后,我看到初始线,加上触摸#2的线 - 但不是触摸#1的线。触摸#3后,我会看到触摸#1和#3的线条。触摸#4后,我看到了初始线和触摸#2和#4的线条。等等。
答案 0 :(得分:2)
UIView
具有clearsContextBeforeDrawing
布尔属性,可在您描述的不同行为之间切换。默认值为YES,表示视图在调用drawRect:
检查示例中的某处是否设置了该属性。
当视图上没有设置backgroundColor时,显然视图无法正确清除它的上下文。请将backgroundColor设置为nil以外的其他内容。
我认为这是一个错误并已提交rdar://8165730。
修改
这不是一个错误。您必须将opaque属性设置为NO或backgroundColor。 UIView文档中描述了该行为。
财产clearsContextBeforeDrawing
:
此属性的默认值为 是。设置为YES时,表示当前 图形上下文缓冲区 drawRect:方法是自动的 之前清除透明黑色 drawRect:被调用。如果是视图的话 opaque属性也设置为YES, 的backgroundColor属性 视图不能为零或绘制错误 可能会发生。
如果此属性的值为NO, 这是观点的责任 完全填写其内容。画画 如果这样可以提高性能 属性是否 - 例如,何时 滚动。
财产opaque
:
是不透明的;否则,不。如果 不透明,绘图操作假定 视图填补了它的范围,可以 更有效地画画。结果是 如果不透明和视图不可预测 没有填补它的范围。设置这个 如果视图完全或是,则属性为NO 部分透明。默认 值为YES。