auto

CoreGraphics を使って角丸を描くのは、よく使うわりに覚えられなくて、いつも調べてしまいます。

下のサンプルでは、角丸の左の縦の辺の中間点 (1 のところ) から、反時計回りで描画しています。

CGContextAddArcToPoint は、現在の座標から x1, y1 の座標までの直線と、x1, y1 から x2, y2 の直線の交わるところを弧にしてくれる便利なメソッドです。

CGContextAddArcToPoint(c: CGContext?, x1: CGFloat, y1: CGFloat, x2: CGFloat y2: CGFloat, radius: CGFloat)
private func drawRoundRect(rect: CGRect, radius: CGFloat, color: UIColor) {
    let context: CGContextRef = UIGraphicsGetCurrentContext()!

    CGContextSetFillColorWithColor(context, color.CGColor)

    /*
             2
       2  -------  3
         |       |
       1 |       | 3
         |       |
       5  -------  4
             4
    */

    CGContextMoveToPoint(context, CGRectGetMinX(rect), CGRectGetMidY(rect)) // 1
    CGContextAddArcToPoint(context, CGRectGetMinX(rect), CGRectGetMinY(rect), CGRectGetMidX(rect), CGRectGetMinY(rect), radius) // 2
    CGContextAddArcToPoint(context, CGRectGetMaxX(rect), CGRectGetMinY(rect), CGRectGetMaxX(rect), CGRectGetMidY(rect), radius) // 3
    CGContextAddArcToPoint(context, CGRectGetMaxX(rect), CGRectGetMaxY(rect), CGRectGetMidX(rect), CGRectGetMaxY(rect), radius) // 4
    CGContextAddArcToPoint(context, CGRectGetMinX(rect), CGRectGetMaxY(rect), CGRectGetMinX(rect), CGRectGetMidY(rect), radius) // 5
    CGContextClosePath(context)

    CGContextFillPath(context)
}

参考

iPhone アプリ研究会 Quartz でも角丸矩形