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などで元に戻してやらなければならないのだろうか。