代码之家  ›  专栏  ›  技术社区  ›  William Jockusch

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

  •  0
  • William Jockusch  · 技术社区  · 14 年前

    我面前有两个石英iPhone应用程序。在每个视图中,对setNeedsDisplay的调用都会导致视图重新绘制自身。但有一个重要的区别。在一个例子中(Mark/Lamarche的书《开始iPhone开发》中的“Quartz Fun”应用程序),每次视图都是空白的。在另一种情况下(我正在开发的应用程序),视图从以前的视图开始,并在其上添加新的图形。

    我不明白为什么会这样。有人能给我提供线索吗?

    编辑2:我还是不明白这里发生了什么。但我发现我可以打电话来澄清我的观点

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextClearRect(context, self.frame);
    

    编辑#3:显示缩短的代码:

    正如一位评论员所建议的,我已经编辑了我的应用程序,所以这个问题只需要很少的代码就可以解决[问题的形式现在有所不同,如下所述。]

    应用程序代表:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
        DiceView *dv = [[DiceView alloc]initWithFrame: window.frame];
        [window addSubview:dv];
    
        [dv release];
        [window makeKeyAndVisible];
        return YES;
    

    }

    骰子视图:

    - (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 回复  |  直到 14 年前
        1
  •  2
  •   tonklon    14 年前

    UIView clearsContextBeforeDrawing 在所描述的不同行为之间切换的布尔属性。默认值为YES,这意味着视图在调用 drawRect:

    检查该属性是否设置在示例中的某个位置。

    我认为这是一个错误,并已提交 rdar://8165730 .


    不是虫子。必须将opaque属性设置为NO或backgroundColor。UIView文档中描述了该行为。

    :

    此属性的默认值为 中的图形上下文缓冲区 drawRect:方法将自动 drawRect:被调用。如果视图 不透明属性也设置为是, 背景色特性 视图不能为零或图形错误 可能发生。

    如果这个属性的值是NO, 完全填满它的内容。绘图 属性是nox例如,当 滚动。

    财产 opaque :

    是的,如果它是不透明的;否则,不。如果 不透明,绘图操作假定 视图填充其边界并可以 画画效率更高。结果是 没有填满它的边界。设置此 属性设置为“否”(如果视图是完全视图或 部分透明。默认值 值为YES。