今回は

って感じで、色パレット兼用、色履歴ビューを作るっす。名付けて
ColorHistoryView

用意する色パレットはこんな感じで
(1 + (7 x 2)) x 6 = 90色
のパレット。
色自体はUIColorインスタンスとして管理し、こいつをNSMutableArrayで配列として保持するわけですわ。
インディックスと表示順の関係はこんな感じ。

当然、画面内に入りきらないんでスクロールできるようにします。で、ずるずるスクロールすると履歴部分が出てくるようにする。

こいつは、Canvasに絵を描くたびに使った色を履歴として保存していくようにし、最大
6 x 3 = 18色
を保持するようにします。
最初は空なんで、先頭にどんどんUIColorインスタンスを挿入。

18個溜まった後は、18番目のUIColorインスタンス解放してから、先頭に挿入。

ただ~し、履歴のUIColorインスタンスを使って描画された場合、NSMutableArray内に同一のUIColorインスタンスが存在するので、18番目じゃなく、こっちを解放。
そうして改めて先頭に挿入。

こうすることで、絶えず最後に使った色が先頭に表示されることになるわけっす。
ま、いまいち、せわしないんですが…
ColorHistoryViewの構成はこんな感じ。

このHistoryContentsViewでのtouchesEndedイベントを拾って、おなじみdelegateでcolorViewControllerインスタンスにこのUIColorインスタンスが選ばれたよって通知するわけですわ。
@protocol ColorHistoryViewDelegate
-(void)penColor:(UIColor*)color;
@end
で、受け取ったcolorViewController側はこいつをpenDelegateに対してsetPenColor:で通知してやるわけですな。delegate数珠つなぎというやつです。
あとは、自分が持ってるpenSizeview、penColorSaturationview、penColorBrightnessviewをこの新しいUIColorで更新してやればいいんですが、ここでひとつ問題。
penSizeviewにはUIColorインスタンスをそのまま渡せるけど、penColorSaturationview、penColorBrightnessviewはhue、saturation, brightness変数を計算して渡す必要があるんですな。
UIColorはたとえ色相、彩度、明度で設定しても、取り出せるのはRGBなので、RGBから色相、彩度、明度に変換する関数が必要になるわけです。
Cocoaのフレームワーク探したんだけど、今のところ未確認。
しょうがないので本を参考に自前で用意しますた。
static void RGBtoHSB(UIColor* inColor,double *H,double *S,double *B)
ウェブだと翔泳社のサイトが参考になると思われ。
ありがとう翔泳社。
RGB←→HSB相互変換【Windowsプログラミング研究所】
ワシにはこれがあるがな~
HistoryContentsViewの開閉に関しては、もう書かない。
その(182)でやってるのと同じです。
ボタンクリックの対応も
UIButtonをプログラム上で作り利用するを読んでください。
で、あとは履歴の取り方。
こいつはCanvasViewから、ペンで画像を描いたら毎回、使った色を通知するようにします。
@protocol CanvasViewDelegate
-(void)penDrawed:(UIColor*)penColor;
@end
こいつをcolorViewControllerが受け取って、ColorHistoryViewの
-(void)penDrawed:(UIColor*)penColor;
を呼び出して更新。内部ではHistoryContentsViewの同じメソッドを呼び出してます。
ここらへん、HistoryContentsViewを公開して直でつなぐ事もできるんですが、ColorHistoryViewで隠蔽しちゃいます。
こういう風にしておくと、HistoryContentsViewのデザインを変えても、他のクラスに変更を要求せずに済むってメリットがあるわけですな。
------------
サンプルプロジェクト:
paint01.zip