AppStoreにアップする(5)

 前回に続いてDiscountRuleCell.xib。

 タブに103を指定しているのはStarIndcatorViewクラスだよというところから。
 こいつは、UIViewを継承してるクラスでInterface BuilderではUIViewインスタンスをドロップした後、Inspector Window(Tools>Inspectorメニューね)のIdentityタグにあるクラスをStarIndcatorViewに変更する事で設定しとります。

$テン*シー*シー-1

 StarIndcatorViewはどんなクラスかというと、countというプロパティに指定された数(0~3)だけ星マークを描くビュー。星が無いところはCGContentFillEllipseInRect使って、灰色の円を表示してる。

$テン*シー*シー-2

 でもってユーザーのタッチイベントにも対応してて、指の位置に応じて星の数が変わるようになっとります。ちなみにStarIndcatorViewクラスのinitWithFrame:メソッドで
self.exclusiveTouch = NO;

 としてるけど、デフォルトがNOだった。意味無し。
 つかYESにしても変化ないな、なんで設定したんだろ?

 DiscountRuleCellではあくまで表示用なので、User Interaction EnableをOFFにしてる。
 なので、タッチには反応しません。

$テン*シー*シー-3

 それとUser Interaction EnableがONかOFFかで星の間隔も変えてる。

$テン*シー*シー-9

 メンバ設定画面で使ってみたら、ちょっと狭かったんでな~。
 ここらへんの対応、若干、泥縄。

 紛らわしいがIdentityタグ側のUser Interaction EnableはAccessibility用で別物。詳しくはAppleのAccessibility に書いてるようだけど私は読んでません。補助用機能みたいっす。


 あと、結構XIB側でコネクション設定してます。

$テン*シー*シー-5

 あれれ、ソースで何もアクション設定してないのになんで動くの?とか思った時は、上のようにInspector WindowのConnectionsタグを探ってみて下さい。

 StarIndcatorViewと同じようにSexIndicatorViewてのも用意してます。
 こっちは特にタッチには反応しません。男か女か、設定によって表示するアイコンを変えるだけ。

$テン*シー*シー-6

 SexIndicatorViewのdrawRect:メソッドでやってるのがそれ。
[[UIImage imageNamed:male?@"male.png":@"female.png"] drawInRect:r];

 UIImageクラスのimageNamed:メソッドはシステム側でキャッシュするので、こういう書き方をしても遅くならない(はず)。
 で、気づいたんだけどStarIndcatorViewの方は
UIImage* starImage = [[UIImage imageNamed:@"star.png"] retain];

 とかやっちゃってますな。大ミス。
 まあ、これもシステム側でキャッシュしてるために、毎回同じインスタンスが返されててメモリーリークとはなってない。たまたま。
 retainいりませんね。最初static変数で管理しようとしてて、UIImage imageNamed:でいいやって思い直したんだよね。とり忘れ。

 設定が切り替わるたびにStarIndcatorViewとSexIndicatorViewをremoveFromSuperviewとaddSubviewで切り替えつつ、割引きの種類を示すのがDiscountRuleIndicatorView。
 
$テン*シー*シー-7

 こいつを最大4つまで配置するのがTotalDiscountRuleIndicatorViewちゅーわけだ。

$テン*シー*シー-8

 TotalDiscountRuleIndicatorView のreloadメソッドてのがそれです。
 まず
for (UIView * view in self.subviews) {
[view removeFromSuperview];
}

 で自分が持ってるサブビューをすべてとりはぶいて、あらためて設定にしたがってTotalDiscountRuleIndicatorViewを追加し直す。

 以上、DiscountRuleでした~。
 ここらがだいたい3月18日~3月20日のトータル8時間くらい。

 次回はOpenGLでダイス描画。