オリジナルデザインのトグル・スイッチをいとも簡単に作れる「ToggleView」をつくってみた。

あけましておめでとうございます。
昨年の暮れにちょこちょこと手をいれていたUIコンポーネントを紹介します。

##標準UIでは満足できない方へ
標準のスイッチのデザインではどうしてもアプリの雰囲気に合わない時ってありますよね。
実際、仕事の中でも、やはりトグル・スイッチのUIはデザイン変えて欲しいという話がちらほら。

一度作ってしまえばそこまで複雑なものではないのですが、いい機会だったので
ほぼ汎用的に使えるようにUIコンポーネントとしてまとめてみました。
![toggleView_design1](http://f.cl.ly/items/0q0B422z3f1V3d2z1M3q/toggleView_design1.png)
<br>
<br>
[こちらに](https://github.com/somtd/ToggleView)リポジトリがありますので、まずはサンプルから解説していきます。

ToggleViewの主な要素は、 

- ToggleView
- ToggleButton
- ToggleBase

となっており、**ToggleView**が**ToggleBase**というボタンが移動する範囲の背景画像をもつビューと、ToggleBaseの上を左右いったり来たりする**ToggleButton**というボタンのビューからなりたっています。
**ToggleBase**、**ToggleButton**それぞれデザインを自由に入れられるようになっています。

##ToggleViewのタイプ
ToggleViewのタイプは現在、２種類用意しています。
引数の**toggleViewType:**を変更することで簡単に設定可能です。 

**toggleViewType:ToggleViewTypeWithLabel**:ToggleViewの左右にタップ可能なラベルがついているタイプ 

```objc
toggleViewWithLabel = [[ToggleView alloc]initWithFrame:frame toggleViewType:ToggleViewTypeWithLabel toggleBaseType:ToggleBaseTypeDefault toggleButtonType:ToggleButtonTypeDefault];
toggleViewWithLabel.toggleDelegate = self;
```

**toggleViewType:ToggleViewTypeNoLabel**:ToggleViewの左右にラベルがついていないタイプ 

```objc
toggleViewWithoutLabel = [[ToggleView alloc]initWithFrame:frame toggleViewType:ToggleViewTypeNoLabel toggleBaseType:ToggleBaseTypeDefault toggleButtonType:ToggleButtonTypeDefault];  
toggleViewWithoutLabel.toggleDelegate = self;
```

##ToggleBase（トグル・スイッチの背景）のタイプ
トグル・スイッチの背景を選択している状態に合わせて変更することができます。引数の**toggleBaseType:**を変更することで簡単に設定可能です。

**toggleBaseType:ToggleBaseTypeChangeImage**:ToggleViewの選択状態に応じて背景画像が変わるタイプ

```objc
toggleViewBaseChange = [[ToggleView alloc]initWithFrame:frame toggleViewType:ToggleViewTypeNoLabel toggleBaseType:ToggleBaseTypeChangeImage toggleButtonType:ToggleButtonTypeDefault];
toggleViewBaseChange.toggleDelegate = self;
```
背景画像は**ToggleBase.m**の下記のファイル名を置き換えてください。

```objc
//change base image option
NSString *const TOGGLE_BASE_IMAGE_L     = @"toggle_base_l.png";
NSString *const TOGGLE_BASE_IMAGE_R     = @"toggle_base_r.png";
```
##ToggleBase（トグル・スイッチのボタン）のタイプ
トグル・スイッチのボタンを選択している状態に合わせて変更することができます。引数の**toggleButtonType:**を変更することで簡単に設定可能です。

**toggleButtonType:ToggleButtonTypeChangeImage**:ToggleViewの選択状態に応じて背景画像が変わるタイプ

```objc
toggleViewButtonChange = [[ToggleView alloc]initWithFrame:frame toggleViewType:ToggleViewTypeNoLabel toggleBaseType:ToggleBaseTypeDefault toggleButtonType:ToggleButtonTypeChangeImage];
toggleViewButtonChange.toggleDelegate = self;
```
ボタン画像は**ToggleButton.m**の下記のファイル名を置き換えてください。

```objc
//change button image option
NSString *const TOGGLE_BUTTON_IMAGE_L    = @"toggle_button_l.png";
NSString *const TOGGLE_BUTTON_IMAGE_R    = @"toggle_button_r.png";
```

##ToggleViewDelegateメソッドの実装

デリゲートというほどでもないですが、 ToggleView側でボタンを切り替える毎にSampleViewController側でも状態の切り替えを受け取るようになってます。

**SampleViewController.h**

```objc
#import "ToggleView.h"
@interface SampleViewController : UIViewController <ToggleViewDelegate>
```
**SampleViewController.m**

```objc
#pragma mark - ToggleViewDelegate

- (void)selectLeftButton
{
    NSLog(@"LeftButton Selected");
}

- (void)selectRightButton
{
    NSLog(@"RightButton Selected");
}
```

##TogleViewのプロパティ
プロパティに関しては最低限、トグル・スイッチの選択のみ用意しています。

**ToggleView.h**

```objc
@property (nonatomic) ToggleButtonSelected selectedButton;
```

選択状態を外部からも変更できるように実装しています。 

**ToggleView.m**

```objc
- (void)setSelectedButton:(ToggleButtonSelected)selectedButton
{
    switch (selectedButton) {
        case ToggleButtonSelectedLeft:
            [self onLeftButton:nil];
            break;
        case ToggleButtonSelectedRight:
            [self onRightButton:nil];
            break;
        default:
            break;
    }
}
```

##デザイン上の注意点
サンプルで表示されているデザインのようにトグル・スイッチの背景の外形とボタンの外形にマージンをとるためには、ボタンのデザイン部分に下図のように透明部分を作ってあげる必要があります。 

背景の外形とスイッチの外形をピッタリにしたい場合はこの限りではありません。

![toggleView_design2](http://f.cl.ly/items/3d0A0C381j3o401i2C03/toggleView_design2.png)

##まとめ
今回はじめてUIコンポーネントを公開してみました。使い勝手の面ではまだまだ未熟な部分があると思いますので、「ここイマイチやなー」という部分にはPull reqestお待ちしております。
https://github.com/somtd/ToggleView

簡単にオリジナルのトグル・スイッチを作ってみたいと思っていた人は是非一度試しに使ってみて下さい。