我正在尝试绘制一个带有数字的圆圈:
-(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();
}
索引编号的点在正确的位置彼此相邻绘制:)感谢您的有用帮助!
答案 0 :(得分: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
}
答案 1 :(得分:1)
我假设您在- (void)drawInRect:(CGRect)rect
的子类中实现了UIView
。如果是这样,请使用- (void)drawRect:(CGRect)rect
,因此在调用方法时已经分配了绘图的上下文。删除UIGraphicsBeginImageContext
和UIGraphicsEndImageContext
来电。另外,您不应在drawRect
中添加子视图,而是使用[i drawInRect:withFont:]