前回同様、今回もUITextViewをUITextFieldの角丸と同じような見た目に変更してみる。
今回は、ココを参考にUITextViewのdrawRectメソッドをオーバーライドして自分で絵を描いてみる。
#1:まずは角丸矩形のパスを作成するメソッドを用意しておいて…
- (void)addRoundRectPath:(CGContextRef)context rect:(CGRect)rect radius:(CGFloat)radius
{
CGFloat minX = CGRectGetMinX(rect);
CGFloat midX = CGRectGetMidX(rect);
CGFloat maxX = CGRectGetMaxX(rect);
CGFloat minY = CGRectGetMinY(rect);
CGFloat midY = CGRectGetMidY(rect);
CGFloat maxY = CGRectGetMaxY(rect);
CGContextMoveToPoint(context, minX, midY);
CGContextAddArcToPoint(context, minX, minY, midX, minY, radius);
CGContextAddArcToPoint(context, maxX, minY, maxX, midY, radius);
CGContextAddArcToPoint(context, maxX, maxY, midX, maxY, radius);
CGContextAddArcToPoint(context, minX, maxY, minX, midY, radius);
}
#2:角丸矩形のみ描画してみる…
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
CGFloat radius = 5.0f; // 角丸の半径
[self addRoundRectPath:context rect:rect radius:radius];
[[UIColor whiteColor] setFill];
CGContextClosePath(context);
CGContextDrawPath(context, kCGPathFill);
}

#3:そして影のみ描画してみる…
- (void)drawRect:(CGRect)rect
{
CGRect frame = CGRectInset([self bounds], 3, 3);
CGContextRef context = UIGraphicsGetCurrentContext();
CGFloat radius = 5.0f; // 角丸の半径
// 影描画用の図形を作成
CGContextAddRect(context, [self bounds]);
[self addRoundRectPath:context rect:frame radius:radius];
// 影を設定
CGContextSetShadow(context, CGSizeMake(2.0f, 2.0f), 2.0f);
// 描画
CGContextDrawPath(context, kCGPathEOFill);
}

#2と#3を同時に描画すると…

影描画用に作成した図形が描画されたままなので、角丸矩形でクリッピングする処理を追加
最終的にはこうなった。
- (void)addRoundRectPath:(CGContextRef)context rect:(CGRect)rect radius:(CGFloat)radius
{
CGFloat minX = CGRectGetMinX(rect);
CGFloat midX = CGRectGetMidX(rect);
CGFloat maxX = CGRectGetMaxX(rect);
CGFloat minY = CGRectGetMinY(rect);
CGFloat midY = CGRectGetMidY(rect);
CGFloat maxY = CGRectGetMaxY(rect);
CGContextMoveToPoint(context, minX, midY);
CGContextAddArcToPoint(context, minX, minY, midX, minY, radius);
CGContextAddArcToPoint(context, maxX, minY, maxX, midY, radius);
CGContextAddArcToPoint(context, maxX, maxY, midX, maxY, radius);
CGContextAddArcToPoint(context, minX, maxY, minX, midY, radius);
}
- (void)drawRect:(CGRect)rect
{
CGRect frame = CGRectInset([self bounds], 3, 3);
CGFloat radius = 5.0f;
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
// 矩形(角丸)でクリッピング
[self addRoundRectPath:context rect:frame radius:radius];
CGContextClip(context);
// 矩形(角丸)描画
[self addRoundRectPath:context rect:frame radius:radius];
[[UIColor whiteColor] setFill];
CGContextClosePath(context);
CGContextDrawPath(context, kCGPathFill);
// 影描画用の図形を作成
CGContextAddRect(context, [self bounds]);
[self addRoundRectPath:context rect:frame radius:radius];
// 影を設定
CGContextSetShadow(context, CGSizeMake(2.0f, 2.0f), 2.0f);
// 描画
CGContextDrawPath(context, kCGPathEOFill);
CGContextRestoreGState(context);
}

多少UITextFieldの角丸とは違うところはあるけど、とりあえず良しとしよう!
明日(9月11日)にもiOS 7へのアップデータが配布されるので、
今後、使用することはないかな。。。