石英 - 有时它从空白视图开始,有时它不会

时间:2010-07-03 02:14:44

标签: iphone quartz-graphics

我面前有两个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的线条。等等。

1 个答案:

答案 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。