drawRect没有响应

时间:2012-02-20 13:35:53

标签: iphone objective-c ios uiview core-graphics

我正在尝试绘制一个存储在NSArrary中的一组点的五边形,但是,视图是空的,没有任何错误......

-(void)prepareVertex:(int)noOfVertex
{
  polygonPoint=[NSMutableArray arrayWithCapacity:noOfVertex];
  for(int i=0;i<noOfVertex;i++)
  {
    CGPoint point=CGPointMake(sin((2*M_PI)*i/noOfVertex),(cos(2*M_PI)*i/noOfVertex));
    [polygonPoint addObject:[NSValue valueWithCGPoint:point]]; 
    NSValue *tempVal=[polygonPoint objectAtIndex:i];
    CGPoint tempPoint=[tempVal CGPointValue];
    NSLog(@"%f,%f",tempPoint.x,tempPoint.y);
  }

}

- (void)drawRect:(CGRect)rect
{

  [self prepareVertex:5];    
  for (int i=0; i<5; i++) {
    NSValue *tempVal=[polygonPoint objectAtIndex:i];
    CGPoint tempPoint=[tempVal CGPointValue];
  }


  CGContextRef context=UIGraphicsGetCurrentContext();
  CGContextSetLineWidth(context, 5);
  CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor);
  CGContextMoveToPoint(context, [[polygonPoint objectAtIndex:0] CGPointValue].x, [[polygonPoint objectAtIndex:0] CGPointValue].x);
  for (int i=1; i<5; i++) {
    CGPoint point=[[polygonPoint objectAtIndex:i] CGPointValue];
    CGContextAddLineToPoint(context,point.x, point.y);
  }
  CGContextStrokePath(context);
}

谁能告诉我发生了什么?

2 个答案:

答案 0 :(得分:1)

嗯,首先要注意的是你使用黑色来描边多边形,所以如果你的视图背景也是黑色的,你就看不到任何东西。

然后,我认为这是真正的问题,sin(x)和cos(x)总是在-1和1之间,所以你生成的点是:

CGPoint point=CGPointMake(sin((2*M_PI)*i/noOfVertex),(cos(2*M_PI)*i/noOfVertex));

都位于矩形CGrectMake(-1,-1,2,2)中。您的视图区域很可能被状态栏隐藏。

因此,如果您生成的坐标是正确的,您可以尝试删除状态栏或更改视图的坐标。但我认为你应该做的是将前一行改为:

CGFloat x = centerPoint.x + radius * sin(2*M_PI*i/noOfVertex);
CGFloat y = centerPoint.y + radius * cos(2*M_PI*i/noOfVertex);
CGPoint point = CGPointMake(x, y);

答案 1 :(得分:0)

它在视图的左上角绘制了一些内容。这个数字太小,不容易看到。那是因为polygonPoint中的值(顺便说一句,你应该至少调用数组polygonPoints)介于-1.0和1.0之间。您必须将您的点转换为视图的中心并相应地缩放尺寸。

这样的东西
- (void)drawRect:(CGRect)rect {
    [self prepareVertex:5];    

    CGContextRef context=UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(context, 5);
    CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor);

    CGFloat x = self.center.x + self.bounds.size.width * 0.5 * [[polygonPoint objectAtIndex:0] CGPointValue].x;
    CGFloat y = self.center.y + self.bounds.size.height * 0.5 * [[polygonPoint objectAtIndex:0] CGPointValue].y;
    NSLog(@"Point %f/%f", x, y);
    CGContextMoveToPoint(context, x, y);

    for (int i=1; i<5; i++) {
        CGPoint point=[[polygonPoint objectAtIndex:i] CGPointValue];
        x = self.center.x + self.bounds.size.width * 0.5 * point.x;
        y = self.center.y + self.bounds.size.height * 0.5 * point.y;
        NSLog(@"Point %f/%f", x, y);
        CGContextAddLineToPoint(context, x, y);
    };
    CGContextStrokePath(context);
}

诀窍。