【追記あり】iOS7でも使えてカスタマイズもできるAlertController - MSAlertController

## はじめに
iOS8から[UIAlertView](https://developer.apple.com/library/ios/DOCUMENTATION/UIKit/Reference/UIAlertView_Class/index.html)と[UIActionSheet](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIActionSheet_Class/index.html)がdeprecatedになってしまったので、iOS8でアラートなどを表示する際は[UIAlertController](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIAlertController_class/index.html)を使うことになりました。
しかしながらUIAlertControllerはiOS8以降でしか使えないため、ソースコード内にiOS8以上とiOS8未満の分岐を記述することが必要になってきます。

## 解決方法
[MSAlertController](https://github.com/szk-atmosphere/MSAlertController)を使うことでiOS7でもUIAlertControllerと同じような動作を同じようなコードで実現することができます。
![alert.png](https://qiita-image-store.s3.amazonaws.com/0/60325/4f5e1935-d807-7e93-d357-0796954c0f17.png)

![action_sheet.png](https://qiita-image-store.s3.amazonaws.com/0/60325/a7f5d5a3-537f-2dc1-ae7e-1b9fee7ddd84.png)

## インストール方法
##### ・Cocoapods
Podfileに```pod 'MSAlertController'```を追記し、pod installを行ってください。

##### ・マニュアル
[ここ](https://github.com/szk-atmosphere/MSAlertController/archive/master.zip)からMSAlertControllerのリポジトリをダウンロードし、MSAlertController/の中身を自身のプロジェクトにコピーしてください。

※どちらのインストール方法でも、QuartzCore.frameworkが必須になります。

## 使い方
まず```#import "MSAlertController.h"```をしてください。
##### Alertを表示
``` objective-c
MSAlertController *alertController = [MSAlertController alertControllerWithTitle:@"MSAlertController" message:@"This is MSAlertController." preferredStyle:MSAlertControllerStyleAlert];
    
MSAlertAction *action = [MSAlertAction actionWithTitle:@"Cancel" style:MSAlertActionStyleCancel handler:^(MSAlertAction *action) {
    NSLog(@"Cancel action tapped %@", action);
}];
[alertController addAction:action];
    
MSAlertAction *action2 = [MSAlertAction actionWithTitle:@"Destructive" style:MSAlertActionStyleDestructive handler:^(MSAlertAction *action) {
    NSLog(@"Destructive action tapped %@", action);
}];
[alertController addAction:action2];

MSAlertAction *action3 = [MSAlertAction actionWithTitle:@"Default" style:MSAlertActionStyleDefault handler:^(MSAlertAction *action) {
    NSLog(@"Default action tapped %@", action);
}];
[alertController addAction:action3];
    
[alertController addTextFieldWithConfigurationHandler:nil];
    
[self presentViewController:alertController animated:YES completion:nil];
```
UITextFieldを表示させたい場合は

``` objective-c
- (void)addTextFieldWithConfigurationHandler:(void (^)(UITextField *textField))configurationHandler;
```

を呼び出すことで表示が可能をなります。

##### Action Sheetを表示
``` objective-c
MSAlertController *alertController = [MSAlertController alertControllerWithTitle:@"MSAlertController" message:@"This is MSAlertController." preferredStyle:MSAlertControllerStyleActionSheet];
MSAlertAction *action = [MSAlertAction actionWithTitle:@"Cancel" style:MSAlertActionStyleCancel handler:^(MSAlertAction *action) {
    NSLog(@"Cancel action tapped %@", action);
}];
[alertController addAction:action];
    
MSAlertAction *action2 = [MSAlertAction actionWithTitle:@"Destructive" style:MSAlertActionStyleDestructive handler:^(MSAlertAction *action) {
    NSLog(@"Destructive action tapped %@", action);
}];
[alertController addAction:action2];
    
MSAlertAction *action3 = [MSAlertAction actionWithTitle:@"Default" style:MSAlertActionStyleDefault handler:^(MSAlertAction *action) {
    NSLog(@"Default action tapped %@", action);
}];
[alertController addAction:action3];
    
[self presentViewController:alertController animated:YES completion:nil];
```
※ Action Sheetの場合はUITextFieldの表示はできません。
※ ```MSAlertActionStyleCancel```は複数addすることはできません。

## カスタマイズ
Alert及びAction Sheetに表示されるタイトル、メッセージ、ボタンのフォント、サイズ、色をカスタマイズできます。
##### ・タイトル、メッセージ
MSAlertControllerには下記のプロパティが用意されています。

``` objective-c
@property (strong, nonatomic) UIColor *titleColor;
@property (strong, nonatomic) UIFont *titleFont;
@property (strong, nonatomic) UIColor *messageColor;
@property (strong, nonatomic) UIFont *messageFont;
@property (assign, nonatomic) BOOL enabledBlurEffect;
```

![alert_controller_custom.png](https://qiita-image-store.s3.amazonaws.com/0/60325/32c90b8b-91e2-eb8d-f90b-9e51bb2a12a1.png)

``` objective-c
MSAlertController *alertController = [MSAlertController alertControllerWithTitle:@"MSAlertController" message:@"This is MSAlertController." preferredStyle:MSAlertControllerStyleAlert];
alertController.titleColor = [UIColor blueColor];
alertController.titleFont = [UIFont fontWithName:@"Baskerville-BoldItalic" size:20.0f];
alertController.messageColor = [UIColor greenColor];
alertController.messageFont = [UIFont fontWithName:@"Baskerville-BoldItalic" size:18.0f];
```

##### ボタン
MSAlertActionには下記のプロパティが用意されています。

``` objective-c
@property (strong, nonatomic) UIColor *titleColor;
@property (strong, nonatomic) UIFont *font;
```

![action_custom.png](https://qiita-image-store.s3.amazonaws.com/0/60325/1d84aaba-3164-5560-b6e7-6c0aac910561.png)

``` objective-c
MSAlertAction *action = [MSAlertAction actionWithTitle:@"Cancel" style:MSAlertActionStyleCancel handler:^(MSAlertAction *action) {
    //Write a code for this action.
}];
action.titleColor = [UIColor redColor];
action.font = [UIFont fontWithName:@"Baskerville-BoldItalic" size:18.0f];
[alertController addAction:action];
```

## 今後
現状でObjective-Cにしか対応していませんが、バージョンアップでSwiftにも対応していく予定です。


## 追記
### 2014-11-24 19:18
カスタマイズのプロパティを追加しました。
##### For Alert Controller
``` objective-c
@property (strong, nonatomic) UIColor *backgroundColor;
@property (assign, nonatomic) CGFloat alpha;
@property (strong, nonatomic) UIColor *alertBackgroundColor;
@property (strong, nonatomic) UIColor *separatorColor;
```

##### For Action
``` objective-c
@property (strong, nonatomic) UIColor *normalColor;
@property (strong, nonatomic) UIColor *highlightedColor;
```

![combination.png](https://qiita-image-store.s3.amazonaws.com/0/60325/4e3ae2c4-af3d-ab66-b6fa-ea84c56e74b9.png)

##### サンプルコード
``` objective-c
MSAlertController *alertController = [MSAlertController alertControllerWithTitle:@"MSAlertController" message:@"This is MSAlertController." preferredStyle:MSAlertControllerStyleAlert];
alertController.alertBackgroundColor = [UIColor lightGrayColor];
alertController.backgroundColor = [UIColor blueColor];
alertController.alpha = 0.3f;
alertController.separatorColor = [UIColor redColor];

MSAlertAction *action = [MSAlertAction actionWithTitle:@"Cancel" style:MSAlertActionStyleCancel handler:^(MSAlertAction *action) {
    NSLog(@"Cancel action tapped %@", action);
}];
action.normalColor = [UIColor blackColor];
action.highlightedColor = [UIColor yellowColor];
[alertController addAction:action];

MSAlertAction *action2 = [MSAlertAction actionWithTitle:@"Destructive" style:MSAlertActionStyleDestructive handler:^(MSAlertAction *action) {
    NSLog(@"Destructive action tapped %@", action);
}];
[alertController addAction:action2];

MSAlertAction *action3 = [MSAlertAction actionWithTitle:@"Default" style:MSAlertActionStyleDefault handler:^(MSAlertAction *action) {
    NSLog(@"Default action tapped %@", action);
}];
action3.normalColor = [UIColor darkGrayColor];
action3.highlightedColor = [UIColor whiteColor];
[alertController addAction:action3];

[alertController addTextFieldWithConfigurationHandler:nil];

[self presentViewController:alertController animated:YES completion:nil];
```