Текстовые метки, нарисованные в CGRect, образуют эллиптическую дугу, когда образы, выполненные с использованием тех же координат, образуют дугу окружности
Я новичок в Core Graphics и пытаюсь понять, почему текстовые метки, которые я рисую в CGRect, образуют эллиптическую дугу, когда изображения, которые я рисую с использованием тех же координат, образуют круговую дугу.
Исходный код Arthur Knopper создает круги везде, где затрагивается экран. Удалив метод касаний, я смог создать серию небольших кругов (точек) вдоль дуги окружности (круг uber). Каждая точка центрирована по периметру круга uber (как показано ниже).
Чтобы обозначить каждую точку, я использую те же координаты точки, которые я использовал для размещения точки. Однако текстовые метки образуют эллиптическую дугу, даже если точки образуют дугу окружности (как показано ниже). Ярлыки также скрыты точками при заполнении точек. Причина этого - полная тайна.
Как новичок, я, вероятно, отсутствует в базовой графике что-то основное. Если бы кто-нибудь мог объяснить, что это такое и что мне нужно сделать, чтобы обе дуги были круглыми и помещали ярлыки поверх идентификаторов точек, очень благодарны.
Спасибо.
Вот код.
circleView.h
NSMutableArray *totalCircles;
int dotCount, limit;
float uberX, uberY, uberRadius, uberAngle, labelX,
labelY,dotRadius, dotsFilled, sectors, x, y;
CGPoint dotPosition;
CGRect boxBoundary;
CGContextRef context;
}
- (void)demo;
@end
И...
[email protected] iOSCircleView
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
// Initialization code
totalCircles = [[NSMutableArray alloc] init];
// Set background color
self.backgroundColor = [UIColor whiteColor];
}
return self;
} // frame a view for drawing
- (void)drawRect:(CGRect)rect {
[self demo];
}
- (void)demo {
context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 0.5);
uberX = 120;
uberY = 160;
uberRadius = 30;
sectors = 16;
uberAngle = (2.0 * PI) / sectors;
dotRadius = 20;
dotsFilled = FALSE;
for (dotCount = 1; dotCount <= sectors; dotCount++)
{
// Create a new iOSCircle Object
iOSCircle *newCircle = [[iOSCircle alloc] init];
newCircle.circleRadius = dotRadius;
[self setSectorDotCoordinates]; // make new point for each dot
dotPosition = CGPointMake(x,y); // create each dot
NSLog(@"Circle%i: %@", dotCount, NSStringFromCGPoint(dotPosition));
[self autoLabel]; // text hides behind the dots
newCircle.circleCentre = dotPosition; // place each dot on the frame
[totalCircles addObject:newCircle];
[self setNeedsDisplay];
}
CGContextSetShadowWithColor(context, CGSizeMake(-3 , 2), 4.0, [UIColor clearColor].CGColor);
dotCount = 1;
for (iOSCircle *circle in totalCircles) {
CGContextAddArc(context, circle.circleCentre.x, circle.circleCentre.y, circle.circleRadius, 0.0, M_PI * 2.0, YES); // draw the circles
NSLog(@"Dot %i Filled %i ", dotCount, dotsFilled);
switch (dotsFilled) {
case 1:
CGContextSetFillColorWithColor(context, [[UIColor cyanColor] CGColor]);
//CGContextDrawPath(context, kCGPathFillStroke);
break;
default:
//CGContextStrokePath(context); // draw dot outline
break;
}
dotCount++;
}
} // draw circular dots in circular patterns
- (void)setSectorDotCoordinates {
x = uberX + (uberRadius * cos(uberAngle *dotCount) * 2);
y = uberY + (uberRadius * sin(uberAngle *dotCount) * 2);
} // calculate dot coordinates along a circular arc
- (void)autoLabel {
CGContextSetStrokeColorWithColor(context, [[UIColor blackColor] CGColor]);
boxBoundary = CGRectMake(x-dotRadius, y-dotRadius, x+dotRadius, y+dotRadius);
[[NSString stringWithFormat:@"%i",dotCount] drawInRect:boxBoundary withFont:[UIFont systemFontOfSize:24] lineBreakMode:NSLineBreakByCharWrapping alignment:NSTextAlignmentCenter];
}
Ответы
Ответ 1
Измените boxBoundary
в autoLabel
, CGRectMake
создает прямоугольник с одной координатой точки и шириной и высотой, а не двумя точками:
(void)autoLabel {
CGContextSetStrokeColorWithColor(context, [[UIColor blackColor] CGColor]);
boxBoundary = CGRectMake(x-dotRadius, y-dotRadius, dotRadius*2, dotRadius*2);
[[NSString stringWithFormat:@"%i",dotCount] drawInRect:boxBoundary
withFont:[UIFont systemFontOfSize:24]
lineBreakMode:NSLineBreakByCharWrapping alignment:NSTextAlignmentCenter];
}
В вашем коде "ящики", содержащие тексты, где больше и больше, когда вы направляетесь вправо. (ширина и высота не были зафиксированы)