Я пытаюсь нарисовать поглаженный круг, используя CAShapeLayer и устанавливая на нем круговой путь. Тем не менее, этот метод является менее точным при отображении на экране, чем при использовании borderRadius, или непосредственно в контуре CGContextRef.
Ниже приведены результаты всех трех методов: 
Обратите внимание, что третий плохо отображается, особенно внутри штриха сверху и снизу.
I  имеют значение contentsScale для [UIScreen mainScreen].scale.
Вот мой код рисования для этих трех кругов. Что не хватает, чтобы сделать CAShapeLayer плавно?
@interface BCViewController ()
@end
@interface BCDrawingView : UIView
@end
@implementation BCDrawingView
- (id)initWithFrame:(CGRect)frame
{
    if ((self = [super initWithFrame:frame])) {
        self.backgroundColor = nil;
        self.opaque = YES;
    }
    return self;
}
- (void)drawRect:(CGRect)rect
{
    [super drawRect:rect];
    [[UIColor whiteColor] setFill];
    CGContextFillRect(UIGraphicsGetCurrentContext(), rect);
    CGContextSetFillColorWithColor(UIGraphicsGetCurrentContext(), NULL);
    [[UIColor redColor] setStroke];
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 1);
    [[UIBezierPath bezierPathWithOvalInRect:CGRectInset(self.bounds, 4, 4)] stroke];
}
@end
@interface BCShapeView : UIView
@end
@implementation BCShapeView
+ (Class)layerClass
{
    return [CAShapeLayer class];
}
- (id)initWithFrame:(CGRect)frame
{
    if ((self = [super initWithFrame:frame])) {
        self.backgroundColor = nil;
        CAShapeLayer *layer = (id)self.layer;
        layer.lineWidth = 1;
        layer.fillColor = NULL;
        layer.path = [UIBezierPath bezierPathWithOvalInRect:CGRectInset(self.bounds, 4, 4)].CGPath;
        layer.strokeColor = [UIColor redColor].CGColor;
        layer.contentsScale = [UIScreen mainScreen].scale;
        layer.shouldRasterize = NO;
    }
    return self;
}
@end
@implementation BCViewController
- (void)viewDidLoad
{
    [super viewDidLoad];
    UIView *borderView = [[UIView alloc] initWithFrame:CGRectMake(24, 104, 36, 36)];
    borderView.layer.borderColor = [UIColor redColor].CGColor;
    borderView.layer.borderWidth = 1;
    borderView.layer.cornerRadius = 18;
    [self.view addSubview:borderView];
    BCDrawingView *drawingView = [[BCDrawingView alloc] initWithFrame:CGRectMake(20, 40, 44, 44)];
    [self.view addSubview:drawingView];
    BCShapeView *shapeView = [[BCShapeView alloc] initWithFrame:CGRectMake(20, 160, 44, 44)];
    [self.view addSubview:shapeView];
    UILabel *borderLabel = [UILabel new];
    borderLabel.text = @"CALayer borderRadius";
    [borderLabel sizeToFit];
    borderLabel.center = CGPointMake(borderView.center.x + 26 + borderLabel.bounds.size.width/2.0, borderView.center.y);
    [self.view addSubview:borderLabel];
    UILabel *drawingLabel = [UILabel new];
    drawingLabel.text = @"drawRect: UIBezierPath";
    [drawingLabel sizeToFit];
    drawingLabel.center = CGPointMake(drawingView.center.x + 26 + drawingLabel.bounds.size.width/2.0, drawingView.center.y);
    [self.view addSubview:drawingLabel];
    UILabel *shapeLabel = [UILabel new];
    shapeLabel.text = @"CAShapeLayer UIBezierPath";
    [shapeLabel sizeToFit];
    shapeLabel.center = CGPointMake(shapeView.center.x + 26 + shapeLabel.bounds.size.width/2.0, shapeView.center.y);
    [self.view addSubview:shapeLabel];
}
@end
EDIT: для тех, кто не видит разницы, я нарисовал круги друг над другом и увеличил масштаб:
Здесь я нарисовал красный круг с drawRect:, а затем снова нарисовал идентичный круг с drawRect: зеленым над ним. Обратите внимание на ограниченное кровотечение красного цвета. Оба эти круга являются "гладкими" (и идентичны реализации cornerRadius):
 
В этом втором примере вы увидите эту проблему. Я нарисовал один раз с помощью CAShapeLayer в красном цвете и снова сверху с реализацией того же пути drawRect:, но в зеленом цвете. Обратите внимание, что вы можете видеть намного больше несогласованности с большим количеством кровотечений из красного круга внизу. Это явно делается другим (и хуже) образом.
 


