我正在尝试在iOS5中使用setNeedsDisplayInRect:
来优化一些绘图代码。设置很简单:我有一组CGRect'热点'作为按钮。当检测到触摸时,我找到它发生的CGRect,并以该矩形作为参数调用视图上的setNeedsDisplayInRect:
。所有CGRect都对视图有效 - 它使用它们来进行初始绘制并且正确显示。
我所看到的(如下面的控制台转储所示)是对setNeedsDisplayInRect:
的第一次调用将视图框作为rect传递,而不是我指定的矩形。后续调用是正确的。
任何人都可以确认这是一个错误,或者看到我在这里做错了吗?所有代码都在下面。 - 谢谢!
WRONG -> drawRect with rect 0.000000 0.000000 70.000000 660.000000
drawRect with rect 15.000000 260.000000 40.000000 40.000000
drawRect with rect 15.000000 310.000000 40.000000 40.000000
drawRect with rect 15.000000 360.000000 40.000000 40.000000
drawRect with rect 15.000000 410.000000 40.000000 40.000000
drawRect with rect 15.000000 460.000000 40.000000 40.000000
drawRect with rect 15.000000 510.000000 40.000000 40.000000
drawRect with rect 15.000000 410.000000 40.000000 40.000000
drawRect with rect 15.000000 310.000000 40.000000 40.000000
drawRect with rect 15.000000 260.000000 40.000000 40.000000
drawRect with rect 15.000000 110.000000 40.000000 40.000000
drawRect with rect 15.000000 610.000000 40.000000 40.000000
drawRect with rect 15.000000 510.000000 40.000000 40.000000
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint point = [touch locationInView:self.view];
CGRect rect;
int cnt = self.barNoteArray.count;
for (int i = 0; i < cnt; i++) {
rect = [[self.barNoteArray objectAtIndex:i] cellRect];
if (CGRectContainsPoint(rect, point)) {
self.bar.highlightIndex = 1;
[self.bar setNeedsDisplayInRect:rect];
break;
}
}
}
- (void)drawRect:(CGRect)rect
{
if (highlightIndex){
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, [UIColor greenColor].CGColor);
CGContextAddRect(context, rect);
CGContextFillPath(context);
highlightIndex = 0;
printf("drawRect with rect %f %f %f %f \n", rect.origin.x,
rect.origin.y,
rect.size.width,
rect.size.height);
} else {
// other drawing code
}
答案 0 :(得分:2)
我也有这个问题。我已将其缩小到以下情况:
当我从一个UIView转移到另一个UIView时,似乎发生了这种情况。在我的例子中,用户在一个UIView中选择绘画工具,然后在底层UIView(画布)上绘图。
初始笔划似乎将drawRect中收到的rect从您放入的内容更改为完整视图大小。一旦绘制了一个或两个drawRects,它就不会改变你放在那里的东西。
我可以证明它是一个setNeedsDisplayInRect,因为如果我评论有问题的行,则不再调用drawRect。在调用之前的rect显示然后更新正确的子矩形,drawRect中的rect显示不同的矩形。
同样,这只发生在从一个UIView到另一个UIView的初始移动中(似乎)。