iOS7のボタンを旧Round Rect Buttonのようにする

iOS 6.1、あるいはそれ以前に作られたアプリにおけるボタンとは、Round Rect Buttonという角丸のボタンがデフォルトであった。まあ、それ自体、決して良い見た目ではなかったので、多くの場合はカスタムボタンを作成していたわけだが、中にはRound Rectを使っているアプリもあるだろう。

そういったアプリをiOS7用にXcode 5.0で再コンパイルすると、ボタンの外観は、ふちなし、背景色なしの、およそボタンには見えない見た目に変わってしまう。

これを元のRound Rectのような見た目に変更するには、ViewController#viewDidLoadなどで、以下のようにしてやる。

button.layer.borderColor = [UIColor grayColor].CGColor;
button.layer.borderWidth = 1.0f;
button.layer.cornerRadius = 7.5f;

しかし、数多くの画面を持つアプリでこの対処をするのは少々骨が折れる。仮に、すべてのRound Rectボタンが、Storyboard上で定義されているとするならば、すべてのボタンで共通の外観設定を行うカスタムボタンクラスCを定義した上で、Storyboardの各ボタンの実装クラスをCに設定してやればよい。そのようにすれば、Storyboard以外のソースファイルは一切変更することなく対処できるはずだ。

MyButton.h

#import <UIKit/UIKit.h>
@interface MyButton : UIButton
@end

MyButton.m

#import "MyButton.h"

@implementation MyButton

-(id)initWithCoder:(NSCoder*)aDecoder {
    self = [super initWithCoder:aDecoder];
	
    if (self) {
        self.layer.borderColor = [UIColor grayColor].CGColor;
        self.layer.borderWidth = 1.0f;
        self.layer.cornerRadius = 7.5f;
    }
	
    return self;
}

@end


たぶんこれが一番簡単な対応方法ではないだろうか。

ところで、より厳密にRound Rectのようにするには、ボタンが押されたときに背景を青、タイトルテキストを白にしてやる必要があるのだが、UIButton#setBackgroundColor:forState:メソッドというのが見当たらない。そこまでするには、touchDownInsideなどのイベントで背景色などを変えて、touchDragOutside, touchUpInside, touchUpOutsideなどで元に戻してやらなければならないのだろうか。