8

我正在尝试画一个里面有一个数字的圆圈:

   -(void)drawRect:(CGRect)rect {
    //Drawing code
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(context, 4.0);
    CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor);
    CGContextBeginPath(context);
    CGContextAddEllipseInRect(context, rect);
    CGContextDrawPath(context, kCGPathFillStroke);

    // Label and index code
    UILabel* circleLabel = [[UILabel alloc] init];
    NSString *i=[Index stringValue];
    [circleLabel setText:i];
    [self addSubview:circleLabel];




}

我从自己的方法中调用 drawRect 方法:

-(void)addPhotoIndex:(NSNumber*)tempNumber withCoordinate:(NSString*)currentTouchPos{
    self.coord= CGPointFromString(currentTouchPos);
    CGRect rect= CGRectMake ((coord.x - 5), (coord.y- 5), 5, 5);
    NSNumber *Index= tempNumber;
    [self drawRect:rect];




}

它本身是从 ViewController 调用的。

但这不是什么都没画,也没有给出任何错误。有人可以帮我吗?

解决方案:

最后,这就是它的工作原理:

  -(void)addPhotoIndex:(NSNumber*)tempNumber withCoordinate:(NSString*)currentTouchPos{

    self.coord= CGPointFromString(currentTouchPos);
    CGRect rect= CGRectMake ((coord.x - 3), (coord.y- 3), 3, 3);
    NSNumber *Index= tempNumber;
    NSString *i=[Index stringValue];
    UIFont *font = [UIFont systemFontOfSize:15.0];

    // Drawing Point
    UIGraphicsBeginImageContext(self.frame.size);
    [self.image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(context, 3.0);
    CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor);
    CGContextBeginPath(context);
    CGContextAddEllipseInRect(context, rect);
    CGContextDrawPath(context, kCGPathFillStroke);
    [ i drawAtPoint:self.coord withFont:font];
    self.image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();


}

带有索引号的点在正确的位置彼此相邻绘制:) 感谢您的有用帮助!

4

2 回答 2

4

您应该使用的方法drawRect:不是drawInRect:

您也不需要创建自己的上下文,因为这是为您设置的drawRect:

- (void)drawRect:(CGRect)rect;
{
  // UIGraphicsBeginImageContext(self.bounds.size); <-- not needed
  CGContextRef context = UIGraphicsGetCurrentContext();
  CGContextSetLineWidth(context, 4.0);
  CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor);
  CGContextBeginPath(context);
  CGContextAddEllipseInRect(context, rect);
  CGContextDrawPath(context, kCGPathFillStroke); // Or kCGPathFill

  /*
   * As @Jonathan Cichon points out you should not add subview's here
   * either add them elsewhere or draw the string manually
   */
  // UILabel* circleLabel = [[UILabel alloc] init];
  // NSString *i=[Index stringValue];
  // [circleLabel setText:i];
  // [self addSubview:circleLabel];
  // UIGraphicsEndImageContext(); <-- not needed
}
于 2012-11-05T13:16:10.730 回答
1

我假设您- (void)drawInRect:(CGRect)rectUIView. 如果是这样,请使用- (void)drawRect:(CGRect)rect,因此在调用您的方法时已经分配了绘图的上下文。删除UIGraphicsBeginImageContextandUIGraphicsEndImageContext调用。此外,您不应该在中添加子视图drawRect[i drawInRect:withFont:]而是使用

于 2012-11-05T13:17:08.150 回答