Причина, по которой ваши верхний, нижний и правый края кажутся тоньше диагоналей, заключается в том, что вы отсекаете половину линий, проведенных вдоль этих краев. Как упоминалось в Costique, Core Graphics рисует обводку так, чтобы она была центрирована на пути. Это означает, что половина хода находится на одной стороне пути, а половина хода - на другой стороне. Поскольку ваш путь проходит точно по верхнему, правому и нижнему краям вашего вида, половина обводки выходит за границы вашего вида и не рисуется.
Costique также правильно, что вы должны продвинуть свои пути на .5 баллов. (Технически вы должны двигаться на половину ширины штриха.) Однако вы не указываете свои координаты равномерно на основе переменной rect
, поэтому перемещение всех ваших путей затруднено.
То, что вы хотите сделать, это вставить rect
на .5 в обоих измерениях, настроить графический контекст так, чтобы его источник находился на rect.origin
, и использовать только rect.size
для получения ваших координат - не self.frame.size
. Вот мой тест:
- (void)drawRect:(CGRect)dirtyRect
{
CGContextRef gc = UIGraphicsGetCurrentContext();
CGContextSaveGState(gc); {
CGContextSetFillColorWithColor(gc, [UIColor colorWithWhite:.9 alpha:1].CGColor);
CGContextSetStrokeColorWithColor(gc, [[UIColor blackColor] CGColor]);
CGContextSetLineWidth(gc, 1);
static const CGFloat Radius = 8;
static const CGFloat PointWidth = 20;
CGRect rect = CGRectInset(self.bounds, .5, .5);
CGContextTranslateCTM(gc, rect.origin.x, rect.origin.x);
rect.origin = CGPointZero;
CGContextMoveToPoint(gc, 0, rect.size.height / 2);
CGContextAddLineToPoint(gc, PointWidth, rect.size.height);
CGContextAddLineToPoint(gc, rect.origin.x + rect.size.width - Radius,
rect.origin.y + rect.size.height);
CGContextAddArc(gc, rect.origin.x + rect.size.width - Radius,
rect.origin.y + rect.size.height - Radius, Radius, M_PI / 2, 0.0f, 1);
CGContextAddLineToPoint(gc, rect.origin.x + rect.size.width, rect.origin.y + Radius);
CGContextAddArc(gc, rect.origin.x + rect.size.width - Radius, rect.origin.y + Radius,
Radius, 0.0f, -M_PI / 2, 1);
CGContextAddLineToPoint(gc, PointWidth, 0);
CGContextAddLineToPoint(gc, 0, rect.size.height / 2);
CGContextClosePath(gc);
CGContextDrawPath(gc, kCGPathFillStroke);
} CGContextRestoreGState(gc);
}
Вот результат:
![enter image description here](https://i.stack.imgur.com/tvz8j.png)