iPhone编程setNeedsDisplay无效

时间:2009-07-12 23:50:29

标签: iphone objective-c

实现了我自己的drawRect方法,我正在尝试从Controller类重绘形状,我无法弄清楚如何正确实现setNeedsDisplay来重绘UIView。请帮忙!!

我知道代码很难看,但这是自定义方法:

- (void)drawRect:(CGRect)rect{
// Drawing code
NSArray *kyle = [self pointsForPolygonInRect:rect numberOfSides:[pshape numberOfSides]];
CGContextRef c = UIGraphicsGetCurrentContext();

int counter = [kyle count];
NSLog(@"counter: %d",counter);
int i = 0;
BOOL first = YES;

NSValue *kylevalue;
CGPoint thePoint;
for (i = 0; i < counter; i++) {
    kylevalue = [kyle objectAtIndex:i];
    thePoint = [kylevalue CGPointValue];
    if (first) { //start.
        CGContextMoveToPoint(c, thePoint.x, thePoint.y+5.0);
        first = NO;
    } else { //do the rest
        CGContextAddLineToPoint(c,  thePoint.x, thePoint.y+5.0);
    }
}
CGContextClosePath(c); //solid color
CGContextDrawPath(c, kCGPathFillStroke);    

}

5 个答案:

答案 0 :(得分:3)

我有类似的问题,重绘不能按我的预期工作。似乎setNeedsDisplay不会强制子项重绘,因为那些你需要调用它们的setNeedsDisplay方法。

根据我的需要,我写了一个类别,通过在每个视图上调用setNeedsDisplay来重绘整个屏幕。当然,这可以很容易地修改为从特定视图开始而不是所有窗口。

@implementation UIApplication (Extensions)

+ (void) redrawScreen {
 NSMutableSet* todo = [NSMutableSet set];
 NSMutableSet* done = [NSMutableSet set];
 [todo addObjectsFromArray:[[UIApplication sharedApplication] windows]];

 while ([todo count] > 0) {
  UIView* view = [todo anyObject];
  [view setNeedsDisplay];

  [done addObject:view];
  [todo removeObject:view];

  if (view.subviews) {
   NSMutableSet* subviews = [NSMutableSet setWithArray:view.subviews];

   [subviews minusSet:done];
   [todo unionSet:subviews];
  }
 }
}

@end

希望这对某人有帮助

答案 1 :(得分:1)

我不确定我理解你的问题。在视图上调用-setNeedsDisplay会导致它通过-drawRect:方法重绘。

答案 2 :(得分:0)

只是一些想法 你确认你的方法被调用了吗? 2.您是否确认您的点阵数实际上填充了多个点? 3.实际上在框架的可视区域中的点数是多少? 4.我没有看到你设置笔划线宽,颜色或填充颜色。

答案 3 :(得分:0)

有时候原因可能非常简单:文件所有者与UIView对象没有任何关联。即它的出口设置不正确。 使用IB,ctrl按钮和拖动方法:)

答案 4 :(得分:0)

如果您的绘图具有drawRect方法,请在连接到绘图的代码处查看viewController。这是否正确连接?属性的小圈子是空心的吗?如果财产连接正确,必须填写这个小圆圈。如果它是空心的,请调出故事板。

在故事板中找到情节对象。控制从故事板中的绘图对象拖动到视图控制器上的空心圆。现在你已经连接了出口。尝试再次运行它,看看你的drawRect现在是否被调用。